The Session object is the cause of this. The Session object belongs to an STA (single threaded apartment). When a request arrives belonging to a specific session the worker thread handling the request will enter the apartment that the session object belongs to. However it can only do that if there is not another thread already in that apartment (because an STA can only accomodate one thread at a time).
So your browser starts uploading a file, an ASP request is being executed that is associated with that browser's session. A worker thread handling that upload request enters the apartment to which the session object belongs to. Now you are trying to load another page while that other request is still in progress. When this second request arrives ASP will find that it can't get another worker thread to enter the same sessions apartment because its already occupied with the first request. Hence ASP will place this second request in a queue waiting for the first to vacate the apartment.
The only way to avoid this would be to turn off ASP sessions. This would allow ASP to process requests from the same browser at the same time. However the serious downside is you will no longer have a Session object to work with. You would have to implement any server-side session management yourself including handling concurrency issues such as two requests trying to access any session data at the same time.