Secondly, if I'm not mistaken the behavior doesn't have anything to do with the pipe. It is the scheduling of the subshell (created by () ) which might explain what you're seeing. IOW, when you create the pipeline you are executing "echo blue" in the same shell and "(echo red; echo green)" in a different (child) shell. Execution of these are independent. Since "echo blue" doesn't have to wait for I/O on the pipeline, it runs and exits.
Thirdly, your 1>&2 is perhaps misplaced, ie: if you were expecting red also to be printed you probably want (echo red; echo green) 1>&2 ...
Fourtly, by 1>&2 you are redirecting stdout to stderrr, which in a pipeline implies whatever is received first goes to the parent shell's stderr not to the pipeline (if that was your intention).
IOW, the entire this is the same as executing
/bin/bash -c "echo red; echo green >& 2" >/dev/null ; echo blue
I'd expect the result to be no different
[1] I am aware that bash has echo as a builtin, as opposed to /bin/echo -- which would results in an exec(3), possibly other shells do as well.