A função compose recebe um número indeterminado de funções. Ela retorna uma nova função que recebe um parametro apenas. É essa função que ao ser invocada com um único valor que disparará o reduceRight. O importante é saber nesse momento que uma função retornada lembra dos parâmetros da função que a retornou. Se não fosse assim ela não teria acesso a fns.
Quando você chamar a função retornada com um valor, esse valor será o previous value da última função do array fns. O pulo do gato está aqui:
fns.reduceRight((previousValue, fn) =>
fn(previousValue), value)
O segundo parâmetro de reduceRight, o value
será o previousValue na primeira chamada do reduceRight. Ou seja, o valor passado para a função que recebe um parâmetro apenas.
O resultado da última função será o previous value da função anterior até que todas as funções sejam chamadas. No final, teremos apenas um valor.
O reduceRight só será chamado quando a função retornada por compose for chamada.
As funções reduce e reduceRight não são feitas para apenas fazer somatórios, como seus nomes dizem, ela reduz um array a um único valor aplicando sua lógica de redução.
Consegui lançar uma luz sob a questão? Como você usou function para facilitar seu entendimento, experimente usar console.log para ver o que acontece quando chamar a função.
Qualquer coisa me fala.