Проблема состоит в том, что структура, подобная списку по умолчанию, которую использует JavaScript, представляет собой изменяемые массивы (не истинные c-подобные массивы, они могут быть внутренне реализованы в виде деревьев), в то время как функциональные языки, такие как Haskell или Lisp, используют связанные списки. Вы можете получить первый элемент и остальную часть связанного списка без мутаций за постоянное время. Если вы хотите сделать то же самое в JavaScript (без мутации), вам нужно создать (выделить) новый массив, чтобы получить оставшуюся часть массива.
Однако вся складка может быть реализована с внутренней мутацией. Вся функция не будет делать никаких внешних мутаций:
const foldr = (f, initialValue, arr) => {
let value = initialValue;
for (let i = arr.length - 1; i >= 0; i--) {
value = f(arr[i], value)
}
return value;
}