for корректно работает.
Когда вы удаляете элемент из массива, то его длинна (и кол-во итераций цикла) уменьшаются, при этом счетчик (i) уже указывает на следующий после удаленного элемент массива, из-за этого такой результат.
Для решения проблемы можно воспользоваться методом filter массивов либо в цикле заполнить новый массив необходимыми значениями, а после цикла старый заменить новым.
Пример с методом "filter":
var a = [1, 2, 2, 2, 2, 3, 4].filter(val=>val%2!=0);
alert(a); // [1, 3]