Потому что
смещение.
На первой итерации:
array ====> [4,4,5,4]
index ====> 0
Удаляем 0-й элемент, остаётся [4,5,4]
На второй итерации:
array ====> [4,5,4]
index ====> 1
Не удаляем ничего, потому что array[1] == 5, а пятерку мы не трогаем.
Но третьей итерации:
array ====> [4,5,4]
index ====> 2
Удаляем последнюю 4-ку.
Остаётся [4,5]
Это и есть сухой остаток.
Решение
Перебираем массив в обратном порядке.
var array = [4, 4, 5, 4];
var num = 4;
for(var index=array.length-1; index>=0; index--){
if(array[index] === num){
array.splice(index, 1);
console.log(index + " - позиции - " + num + " удалено");
}
}
console.log(array + " — остальные числа");