Para o ponto 3, se definirmos:
$ d(){ printf '%7s %7s %s\n' "$BASHPID" "$1" $(date -u +'%H:%M:%S'); }
$ p1(){ d START; readarray -t a; printf '%s\n' "${a[@]}" ; sleep 2; d END; }
$ p2(){ d START; sleep 2; d END; }
Então, isso:
$ p1 < <(p2)
imprimirá:
8517 START 20:31:38
11764 START 20:31:38
11764 END 20:31:40
8517 END 20:31:42
Isso significa que ambos começam juntos, mas p1 tem que esperar até que p2 termine para fechar a leitura, então ela dorme e termina.
Resumindo: eles são executados simultaneamente.