Talvez tente:
unset arr
printf %s\n a b c | {
readarray arr
echo ${#arr[@]}
}
Espero que funcione, mas no momento em que você sair do último contexto { shell ; } no final do | pipeline, você perderá seu valor variável. Isso ocorre porque cada um dos processos | separate | dentro de um | pipeline é executado em ( subshell ) . Então, sua coisa não funciona pelo mesmo motivo:
( arr=( a b c ) ) ; echo ${arr[@]}
... não - o valor da variável foi definido em um diferente processo shell do que aquele em que você invoca.