Как оптимально и красиво решить данную задачу?
Ну дак сделай обе функции рекурсией
function factorial(n) {
	if (n > 1) {
		return n * factorial(n - 1);
	} else {
		return 1;
	};
};

function S(n) {
	if (n < 1) {
		return 0;
	} else {
		return (1 / factorial(n)) + S(n - 1);
	};
}
Если прям совсем байты экономиш, то можно и так переписать
function factorial(n) {
	return n > 1 ? (n * factorial(n - 1)) : 1;
}

function S(n) {
	return n > 0 ? ((1 / factorial(n)) + S(n - 1)) : 0;
}
Можно каждый раз не считать с нуля факториал.
const sumFactorials = (maxN) => {
  let factorial = 1;
  const getNextFactorial = (n) => {
    factorial *= n;
    return factorial;
  }

  const adder = (sum, n) => 
  	n < maxN ? 
  	1 / getNextFactorial(n) + adder(sum, n + 1) : 
  	sum + 1 / getNextFactorial(n);

  return adder(0, 1);
}

return sumFactorials(3);