But is there a way to do it without an SD card?
Well certainly there is a way if wants to bad enough. A sketch could be written that knows how to 'talk' the ICSP protocol to the standalone chip (like the arduino as ISP sketch) and have the sketch have the desired hex file data written to the flash memory at compile time for export to external device during run time.
I believe someone here wrote a bootloader writer sketch that includes the different bootloader hex file data in the sketch and transfers the proper data when it determines what kind of chip it's attached to. For burning boot-loaders, that was a real cleaver and useful application.
It's a somewhat limited and awkward method to program a chip, but perhaps it fills a real need in some situations?