Boa tarde.
Bom, não creio que exista um padrão. Contudo, eu faria assim:
chars.filter(char => {
return (
(letters && isLetter(char)) ||
(numbers && isNumber(char)) ||
(special && isSpecial(char))
)
})
Se uma flag for verdadeira, ela permite que sua respectiva função de verificação seja executada para testar o caractere em questão. Se a função retornar verdade, o caractere é incluído no novo array. Como são 3 condições distintas que podem incluir ou não o caractere no novo array, o || foi utilizado para representar essa independência.