Да, вы вызываете конструкцию, которая использует определенные контекстные переменные. И тот факт, что они меняются, причем вами же, никак не относится к асинхронности в принципе)
В моем понимании setTimeout должен был закинуться в event loop и выполниться сразу же после выполнения всего кода (то есть после цикла). В чем я не прав?