Есть множество способов реализации: потоки ОС,
сопрограммы (корутины),
событийный подход.
Конекретно JavaScript -- однопоточный, и в нём используется последний способ. При вызове setInterval/setTimeout внутри js движка создаётся объект, связывающий таймер и коллбэк (обработчик события). Каждый тик движок проверяет не истёк ли таймер и если истёк, то добавляет коллбэк в очередь вызовов. XMLHTTPRequest работает аналогично, только вместо истечения интервала "ожидает" ответ от сервера.
Полезные ссылки: