I think this comes from misunderstanding the Response Object and/or the basic HTTP request structure.
Your Request: GET /buildXLS.aspx
Server 1 Response: /* header info for file download */ /* file data */
Server 2 Response: /* hearder info for HTML page */ <div>Updating...</div> /* file data */
if you try to act like server 1, you can't send any data back on the response but the file itself (and appropriate headers). if you try to act like server 2, the page you're downloading will be treated as HTML and you'll never see the file data, as headers have been written indicating an "text/html" transfer instead of XLS. in fact, once you've flushed the response for any reason, you can't write to it anymore.
i can see a situation where your scenario could work, but only as two interacting pages - page 1 shows the progress message then opens a new window, page 2. page 2 starts the XLS build and then triggers page 1 to hide the progress message when it's complete. now you've got two pages to match the two sets of headers you're trying to send, rather than trying to send both HTML updates and start file downloads within the same response.