tr não interpreta classes de caracteres nesse estilo regex.
[a-zA-Z] é interpretado como um conjunto de [ , o intervalo de caracteres de a a z e ] .
Portanto, seu complemento é o conjunto de caracteres, incluindo todos os caracteres, mas [ , o intervalo de caracteres de a a z e ] .
É por isso que [ e ] não são substituídos.
Para substituir qualquer caractere não alfabético, basta especificar a-zA-Z como o complemento do conjunto a ser substituído:
echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
% echo '[[:lower:]]' | tr -c 'a-zA-Z' '\n'
lower
%