А почему строка? Могли бы и сами догадаться её в массив порезать:
const arr = str.split('-');
const end = 'final';
Использовать рекурсию не нужно, перебираем массив от конца к началу, на каждом шаге создаём объект с единственным свойством, в качестве ключа используется текущий элемент, значение - объект, полученный на предыдущем шаге:
const obj = arr.reduceRight((acc, n) => ({ [n]: acc }), end);
Но, конечно, если очень хочется, то рекурсия возможна:
const obj = (function createObj(arr, i, end) {
return i < arr.length
? { [arr[i]]: createObj(arr, i + 1, end) }
: end;
})(arr, 0, end);