Não há necessidade de um subshell e sed, apenas use a expansão de parâmetros:
while read p ; do
arr+=( "${p%%:*}" )
done < test.txt
Pode ser mais rápido remover todas as substrings em um comando
while read p ; do
arr+=("$p")
done < test.txt
arr=("${arr[@]%%:*}")