Потому что массив row передаётся по ссылке в массив newArray, то есть каждый раз, когда вы пишете newArray.push(row), вы не фиксируете текущее состояние row в newArray, а делаете ссылку на одну и ту же переменную row, которую в дальнейшем меняете.
Чтобы проверить этот тезис, можете запустить например вот такой код:
let a = [1, 2];
let b = [a, a];
console.log(b); // [[1, 2], [1, 2]]
a.push(3); // теперь изменим a и окажется
console.log(b); // [[1, 2, 3], [1, 2, 3]]
Если вы хотите, чтобы в ключах newArray было три разных состояния массива row, используйте например функцию slice:
let newArray = [];
let row = [];
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 2; j++) {
row.push(0);
}
console.log(row)//видим, что сначала 2 элемента, потом 4, потом 6
newArray.push(row.slice()); // функция slice() без аргументов возвращает копию массива, на котором применена
}
console.log(newArray);