Но в один момент мы получили результат и хотим прекратить все это безобразие и вывести результат в основной функции
Я, для таких случаев, выношу объект за пределы рекурсии, и в рекурсивных функциях, перед выполнением, идёт проверка поля из объекта.
Как-то так:
function main () {
const state = {
hasResult: false,
res: null
}
const recFoo = p => {
if(state.hasResult) return; // или так: if(state.res !== null) return;
// ...
// Как только понимаем, что есть результат,
// то пишем его в state.res и меняем флаг state.hasResult на true
// ...
}
recFoo();
return state.res;
}