Hay muchas razones para esto:
1. PHP (el programa que ejecuta tu página en el servidor) retiene las respuestas para darselas en paquetes al servidor.
2. El servidor muchas veces suele enviar «paquetes» de un determinado tamaño, con lo cual espera hasta que se haya alcanzado ese tamaño, o la respuesta se haya terminado para enviarlo. También esperan con objeto de poder comprimir la respuesta completa con "gzip".
3. Puede haber proxies de por medio que retengan la respuesta con el mismo propósito que arriba.
4. Los navegadores a veces no avisan a JavaScript hasta que la respuesta no alcanza un determinado tamaño.
Si todos estos inconvenientes y quirks no son un problema para ti, te aconsejo que eches un vistazo a la función flush():
http://php.net/manual/es/function.flush.php