Делаем просто, ровно то, что спрошено в вопросе:
const result = arr.reduce((acc, n, i, a) => (
n === a[i - 1] + 1 || acc.push([]),
acc.at(-1).push(n),
acc
), []);
Делаем сложно, решаем задачу в более общем виде (группируем элементы не только массивов, а любых итерируемых объектов; условие создания новой группы отделяем от собственно кода группировки):
function* groupAdjacent(
data,
{
key = n => n,
newGroup = (c, p) => c !== p,
} = {}
) {
const iter = data[Symbol.iterator]();
const getVal = key instanceof Function ? key : n => n[key];
for (
let group = [], prev = null, n, i = -1;
!n?.done && (n = iter.next());
n.done || group.push(n.value)
) {
let groupDone = false;
if (!n.done) {
const curr = getVal(n.value, ++i);
groupDone = i && newGroup(curr, prev);
prev = curr;
}
if ((n.done && group.length) || groupDone) {
yield group;
group = [];
}
}
}
Как применять в вашем случае:
const result = [...groupAdjacent(arr, { newGroup: (c, p) => c !== -~p })];
// или
const result = Array.from(groupAdjacent(arr, { key: (n, i) => n - i }));