Потому что клетки текущего поколения, и клетки следующего - это одни и те же клетки.
Вы их такими создали:
cells.push(xCells);
buffCells.push(xCells);
А если даже и создать правильно, всё равно они станут одним и тем же:
cells = buffCells;
UPD.
Вижу, "станут" исправили. Можно лучше (короче, проще и быстрее) - вместо копирования значений клеток поменять местами ссылки на массивы:
[ cells, buffCells ] = [ buffCells, cells ];
.
А вот создание массивов так и осталось кривым. Вложенные массивы должны быть разными, помещайте во второй копию вместо оригинала:
- buffCells.push(xCells);
+ buffCells.push(xCells.map(n => ({...n})));