Таймеры работают асинхронно. Цикл выполняется до того, как срабатывает первый таймер и переменная уже изменена.
А вот если вызывать таймер через стрелочную функцию:
... setTimeout(() => { ...
то в консоль выведется последовательно 1-10. Почему? Потому как стрелочные функции не имеют собственного контекста выполнения, каждый раз, вызываясь, они ориентируются на контекст блока выше, в данном случае самой функции setTimeout, которая уже выполняется в рамках текущих итераций цикла. То есть, в каждой итерации в момент обращения.
Стало немного яснее или еще больше запутал?
Или может я сам неправильно понимаю?))