Depending on the board, which you didn't mention, you may have an output buffer size of 64 bytes. Clearly you are writing at half the reading speed so you would easily overflow the output buffer, after which the code would hang.
You can make your own internal buffer (up to available RAM) if the data arrives in bursts. If it doesn't arrive in bursts this isn't going to work.
Also, am I correct to assume that the 64byte receive buffer is protected by handshaking between the Arduino and the PC so that the PC's transmission is halted if the receive buffer is full.
That is incorrect for most "Arduino" boards.
There is no flow control between the Arduino and the PC on the boards
that use a chip like FTDI and now Atmel chip to perform the virtual com port to serial function
over the USB.
While USB does have flow control built in, there is no flow control on the output
side of the FTDI or Atmel chip that sits between the USB and the AVR.
The chip just keeps blasting out the serial data.
While the FTDI chip does support h/w flow control on the serial output,
the pin is not hooked up to the AVR.
Boards like the Teensy which use native USB inside the AVR do have flow control
since the AVR is processing the USB.
When using that board, the PC would be flow controlled properly.
But in reality, there is no actual baud rate when using a virtual com port
over USB to something like an AVR with native USB. The baud rate is meaningless since there
is no actual serial port involved.