Не надо ничего объединять, нет необходимости использовать циклы в явном виде:
const result = arr.flatMap((n, i) => i & 1 ? n : [...n].reverse());
Если всё-таки нужны именно вложенные циклы, то
const result = [];
for (let i = 0; i < arr.length; ++i) {
const a = i & 1 ? arr[i] : [...arr[i]].reverse();
for (let j = 0; j < a.length; ++j) {
result.push(a[j]);
}
}
UPD. Вынесено из комментариев:
мне как бы очень важна производительность, и reverse() это как бы дополнительная операция
Окей, вот никаких reverse'ов:
const result = arr.reduce((acc, n, i) => (
i & 1
? acc.push(...n)
: n.reduceRight((_, m) => acc.push(m), null),
acc
), []);
// или
const result = [];
for (const [ i, n ] of arr.entries()) {
const [ start, end, step ] = [
[ n.length, -1, -1 ],
[ -1, n.length, 1 ],
][i & 1];
for (let j = start; (j += step) !== end;) {
result.push(n[j]);
}
}