O comando read
da função está usando o mesmo stdin que o read
do loop while. Use um descritor de arquivo diferente. Além disso, a função pode ser mais simples:
func_yesno() {
typeset answer PS3="Cancel (y/n)?"
select answer in Yes No; do
case $answer in
Yes) exit 0 ;;
No) echo "ok"; break ;;
esac
done
}
while read -u3 line; do
echo "line: $line"
func_yesno
done 3< unique.txt