Разъясните пожалуйста как работают эти циклы?
переменная, объявленная через var, видна везде в функции.
Переменная, объявленная через let, видна только в рамках блока 
https://learn.javascript.ru/let-const
Поэтому через таймаут в 1 случае будет число в переменной на данный момент прошедшего времени, а во втором - соответствующее значение в данной итерации цикла
Если var, то используйте замыканиеfor (var i = 0; i < 10; i++) {
    (function (index) {
        setTimeout(function () {
            alert(index);
        }, 100);
    }(i));
}