Nem bonyolult igazából a logika.
Akkor hoz létre subshellt, ha a pipe után shell builtin parancs jön. A pipe azt jelenti, hogy ez előző process stdout-ját kösd a következő process stdin-jére. Egy shell builtin-nek máshogy nem tudna stdin-t csinálni, mert a parent shell stdin-je már foglalt, így kénytelen egy subshellt indítani. Ebből a szempontból a { } egy shell builtinnek számít, mert a benne foglalt - esetlegesen több - parancsot egy shell interpreternek kell értelmeznie.
A sleep (ami rendszeren nézem legalábbis, rhel-like) nem shell builtin, hanem sima külső process, amit a shell exec-elni tud és beköti neki az stdin-re a pipeban előző parancs stdoutját. Ergo nem kell subshell.
(Gondolhatná az ember, hogy a shell builtinnek miért pont az stdin-ről kell olvasnia, nem csinálhatna-e helyette a parent shell egy másik file descriptort? Gondolom visszafele-kompatibilitási okokból nem raktak bele ilyen varázs-logikát. Felteszem a ksh valami ilyen trükkel játssza ki ezt a speciális helyzetet, de most nincs kéznél olyan gép, ahol volna ksh, hogy meg tudjam nézni.)