Последняя версия событий такова:
1. Начало цикла. i = 0
2. Проверка условия i < 5.
- если дает true, то выполняется все, что в теле цикла, в моем примере это trace(i);.
- если дает false, то переходим на 4.
3. Происходит приращение i = i + 1 и переход на 2.
4. Выход из цикла (выполняется следующая после цикла строчка кода).
Тогда будет именно такая картина, которую наблюдаем на практике.
То, что в примере автора в теле цикла выполняется присвоение обработчика ролловер кнопки, никакого значения не имеет, т.е. после выхода из цикла i=5.
PS.
Обработчик ролловер, аж 5(!) раз назначенный в цикле, честно трейсит i. Назначение обработчика само по себе не что иное, как операция присваивания, т.е. можно было с тем же успехом написать

Код:
for (i = 0; i < 5; ++i) {
a = "какая-то фигня";
}
И чему бы вы думали будет равно а на каждой итерации и после выхода из цикла?