Well, I think I know what's going on 
The server keeps a small buffer for outgoing data for each client. And when that client connects, they get lots of data sent to them - all the chunks, entities...
Before, the buffer was resizing - it auto-sized itself to accomodate any amount of data (potentially megabytes of unsent data). I stopped that and made the buffer fixed-size. But at the game start, the buffer just overflows silently and the client won't get all the data; sometimes they'd get half a packet only.

The server keeps a small buffer for outgoing data for each client. And when that client connects, they get lots of data sent to them - all the chunks, entities...
Before, the buffer was resizing - it auto-sized itself to accomodate any amount of data (potentially megabytes of unsent data). I stopped that and made the buffer fixed-size. But at the game start, the buffer just overflows silently and the client won't get all the data; sometimes they'd get half a packet only.