Как будем определять, должен ли элемент остаться:
const mustStay = n => n !== null;
.
Собираем новый массив:
const newArr = arr.map(n => ({
...n,
array2: n.array2.filter(mustStay),
}));
Обновляем существующий:
arr.forEach(n => n.array2.reduceRight((_, n, i, a) => mustStay(n) || a.splice(i, 1), 0));
// или
for (let i = 0; i < arr.length; i++) {
const a = arr[i].array2;
a.splice(0, a.length, ...a.filter(mustStay));
}
// или
for (const { array2: a } of arr) {
let numDeleted = 0;
for (const [ i, n ] of a.entries()) {
a[i - numDeleted] = n;
numDeleted += !mustStay(n);
}
a.length -= numDeleted;
}