I wanted to try to use OSFILE directly, but two more problems presented themselves. The first is that the command block for OSFILE is slightly unusual in only taking a two-byte pointer to the data block containing the filename to use. Most pointers in OS call command blocks are 4 bytes. So again, I can't point to BAS128 memory for the filename, and it has to be stored in main memory.
Even after I did this, OSFILE didn't work and gave a spurious error. It's highly unlikely that calling OSFILE would have succeeded where *SAVE failed in any event.