How to program an ARM microcontroller?
This usually depends on the microcontroller you use, but in general ARM chips have a JTAG interface and even better, a SWD interface. 

SWD consists of two pins -- data and clock -- so it is very easy to plug-in an external programmer to flash the firmware in-circuit.

You can either include a connector or a series of pads in the layout for that purpose. If you use SWD only four pins are needed (three if you power the board from somewhere else): SWDIO, SWCLK, GND and VDD. Reset may or may not be necessary as well, depending on the chip.

Using circular pads in the PCB is nice for scale production: one can have needles or pogo-pins to connect the board -- and you can use those also for board testing...

Anyway, you can supply the PCBA with the firmware binaries, or you can program yourself after production for security purposes. You may supply the PCBA a test version in this case.