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.