If you are on macOS, sorry, you'll make to create a named fifo (you'll get a permission error if you try the code below), but if you're on Linux it's easy-peasy by abusing the process substitution syntax:
$ exec {FD}<> >(:)
$ echo weeee >&$FD
$ head -n 1 <&$FD
weeee
I don't know if that creates an unnecessary subprocess that immediately terminates. Probably. But if you care about that, why are you even doing this in bash?
If you create two pipes, you can connect one to the stdin of a subprocess, one to the stdout, and boom, you've emulated the coproc functionality. It won't have the nice process management going on, though:
$ exec {PIPER}<> >(:) {PIPEW}<> >(:)
$ grep --line-buffered bar <&$PIPER >&$PIPEW &
[3] 14753
$ echo foo >&$PIPER
$ echo bar >&$PIPER
$ echo baz >&$PIPER
$ head -n 1 <&$PIPEW
bar
$ exec {PIPER}>&- {PIPEW}>&-
$ ps p 14753
PID TTY STAT TIME COMMAND
14753 pts/1 S 0:00 grep --color=auto --line-buffered bar
Yeah, so remember to close that subprocess before you leave.