It appears that bash is closing the stream before grep gets a chance to open it; it could be caused by grep not being the first command in the pipeline. Try
function ff() { grep fgrep -f "$1" /etc/group; }
EDIT: Rather than the stream being closed prematurely, it appears that the way bash handles this is by connecting an unnamed pipe between `<(echo user)` and the first command in the pipeline, namely `cat` in your case, and then giving the command a filename of the form `/dev/fd/`*n*, where *n* is the number of the file descriptor of the pipe, in your case 63. The problem occurs because the file descriptor is not duplicated to the other commands in the pipeline, so `cat` has access to the stream but `grep` does not. The remedy is either to move the command that needs access to the stream to the beginning of the pipeline, as above, or, in the event that is not possible, to explicitly use named pipes, e.g.
mkfifo pipe
echo user >pipe &
ff pipe
rm pipe