When you run:
{ mkdir -p dir; cd dir; pwd; } | cat; pwd
OR
{ mkdir -p dir; cd dir; pwd; } | date
OR
{ mkdir -p dir; cd dir; pwd; } | ls
You are running group of commands on LHS of pipe in a sub-shell and hence change dir
isn't reflected in current shell after both commands (LHS and RHS) complete.
However when you run:
{ mkdir -p dir; cd dir; pwd; }; pwd;
There is no pipe in between hence all the commands inside curly braces and pwd
outside curly brace run in the current shell itself hence you get changed directory.
PS: Also note that this line:
( mkdir -p dir; cd dir; pwd; )
Will also not change the current directory in current shell because commands inside square brackets execute in a sub shell whereas curly braces are just used for grouping.