First off, programming the Arduino bootloader onto a blank chip is really really easy. You just need to include an ISP header on the board and then you hook up a cheap programmer like a USBASP and use the Arduino IDE 'Burn Bootloader' command.
Having said that, Microchip do offer a production programming service for commercial quantities.
You’re accepting defeat before you you have any idea of how simple the task is.
Ultimately, I suspect you’ll spend more time trying to figure out how to pay someone to do something you can learn to do in thirty seconds? The tools for programming a raw, blank chip are very inexpensive, cheap even and readily available. The software required to perform the operation are built into the Arduino IDE.
Start with the basics which you must know:
How many units?
Which chip? By that I mean which processor model (AVR, Cortex) and package type (DIP, SMD)?
There several ways to do this. The two most common:
Use a decent quality 28 pin socket on your target board. Using an Uno board that has been loaded with the “Arduino as ISP” sketch (in the IDE), program a blank chip in a “programming shield”. Remove the programmed chip from the ZIF socket (zero insertion force) on the programmer and plug into your board to test.
Using the Uno as a design reference, add a 3x2 pin header to your target board that connects to the ISP pins of the ‘328. With a blank chip in your board (soldered or socketed), plug a USBASP programmer onto the header pins. Program the chip in place, unplug the USBASP and power up the board to test.
#2 is the most flexible and allows for SMD processor packages which are physically smaller and cheaper than DIP devices. Unless you want the end user to be able to easily remove the processor, a soldered SMD package would be considered more reliable than a socketed DIP and of course lower cost.
As mentioned in an earlier post, the software required to program the chips is built into the IDE. Rather using the “download” option, you use the “download with programmer” selection.