If you're looking for more efficient then drop the formatting entirely and just send the binary data.
If you format 256MB of data using HEX2 you end up with twice the number of bytes to transfer (512MB), and it's slower because of the conversions.

At 115K each byte takes about 86us to send, so as long as your code doesn't add more than that in overhead it won't matter. The fastest way would be something like this:
Code:
i  var     byte
b  var     byte[256]

for i = 0 to 255
    ' wait for TRMT == 1
    while (TXSTA.1 = 0)
    wend
    ' send byte from array
    TXREG = b[i]
next
I think you also need to think about using handshaking (RTS/CTS). On the PC side I doubt that it can keep up with a 256MB stream of data.