Esta não é a melhor maneira de fazer isso. Por que analisar o array? Uma abordagem mais simples seria algo como:
path=/home/abc/allfiles
filesall=(${path}/*)
files=(${path}/*.csv)
Se você insistir em fazer do seu jeito, você teria que fazer algo como:
files=($(for file in "${filesall[@]}"; do [[ $file =~ \.csv$ ]] && echo $file; done))
ou
files=($(printf "%s\n" "${filesall[@]}" | grep '\.csv$'))
Mas ambas as quebras acima, se algum dos seus nomes de arquivo contiver espaços em branco.
(Eles podem ser feitos para trabalhar com espaços se você os preceder com saveIFS="$IFS"; IFS=$'\n'
e segui-los com IFS="$saveIFS"
, mas eles ainda quebram na nova linha.)