вообще-то там не было многопоточности.
а было следующее:
вы вызвали функцию, отправляющую запрос на сервер.
функция выполнилась, и в данный момент никакого JS-а не выполняется.
то, что в это время обрабатывается запрос на сервер, JS-а не касается.
когда приходит результат, вызывается обработчик события onreadystatechange, который и обрабатывает запрос.
в момент между отправлением запроса, и приходом результат, в случае асинхронного JS можно выполнить какую-то другую функцию.
если она будет длится достаточно долго, то может произойти так, что результат с суревера уже пришел,но еще не был обработан.
пока не освободится очередь JS, запрос не будет обработан соответствующим обработчиком события.но как только освободится очередь, он будет выполнен.
также и задержка выполнения не гарантирует вызова через указанный промежуток времени.
она гарантирует вызов через время не меньшее указанного промежутка.если будет очередь выполнения, он просто станет в очередь, и будет ждать
для более подробного ознакомления с этими процессами,почитайте
статью