ну поехали

рассмотрим подробнее два кода с помощью flasm
первый

Код:
n = 5;
for (i = 0; i <= (n-1); i++) {}
и второй

Код:
n = 5;
for (i = 0; i < n; i++) {}
для первого получаем

Код:
constants 'n', 'i' // сохраняем константы в пуле
push 'n', 5 // кладем n и 5 в стек
setVariable // инициализация значение n = 5
push 'i', 0.0 // кладем i и 0 в стек
setVariable // инициализация значение i = 0
label1: // это начало цикла
push 'i' // кладем i в стек
getVariable // и берем ее значение
push 'n' // кладем в стек предельное значение, то есть 'n'...
getVariable // и берем ее значение, 5
push 1 // кладем в стек 1
subtract // вычитаем, n-1
greaterThan // вычисляет булево выражение i>4
not // инвертируем и получаем i<=4
not // опять инвертируем и получаем i>4
//// последние две строчки лишние явно
branchIfTrue label2 // если у нас в стеке значение true, то идем к концу цикла на label2
push 'i', 'i' // дважды в стек помещаем i
getVariable // и берем ее значение i=i
increment // увеличиваем значение на 1, стеке i+1
setVariable // берем значение i
branch label1 // переходим на начало цикла
label2: //
а для второго

Код:
constants 'n', 'i' // сохраняем константы в пуле
push 'n', 5 // кладем n и 5 в стек
setVariable // инициализация значение n = 5
push 'i', 0.0 // кладем i и 0 в стек
setVariable // инициализация значение i = 0
label1: // это начало цикла
push 'i' // кладем i в стек
getVariable // и берем ее значение
push 'n' // кладем в стек предельное значение, то есть 'n'...
getVariable // и берем ее значение, 5
lessThan // вычисляет булево выражение i<5
not // инвертируем и получаем i>=5
branchIfTrue label2 // если у нас в стеке значение true, то идем к концу цикла на label2
push 'i', 'i' // дважды в стек помещаем i
getVariable // и берем ее значение i=i
increment // увеличиваем значение на 1, стеке i+1
setVariable // берем значение i
branch label1 // переходим на начало цикла
label2:
Белым я выделил различия. И как видно ни какой разницы кроме как удлинения числа выполняемых команд, типа вычитания и двойного отрицания нет. А если двойное отрицание убрать, сгенерить байт код и вставить за место обычного кода, то получим тоже самое что и с ними.