Hola,
 
Logico, cuando haces un session_start() abres el fichero de sesion y no se cierra hasta que se finaliza el script. Y session_start() espera hasta que ese fichero este cerrado para poder abrirlo. Asi se evita que un script modifique los datos de una sesion mientras la esta usando otro script. 
Solucion a tu problema: session_write_close() (
http://www.php.net/manual/en/functio...rite-close.php)., justo despues de haber autentificado el acceso a la descarga y antes de mandar los datos del fichero. 
Saludos.