This isn't an solution on how to use async features, but one which will also satisfy your needs, i think.
Basically, you can move the fetching part to an external application, and just read the mails with emacs. Therefore, emacs doesn't have to download them, which should conclude in a non-blocking gnus/emacs. After you've set up the email-retriever, you can just change the way
gnus gets its emails to a local path.
If you want to use IMAP, I'd suggest to use
offlineimap. It's a small python script, which downloads your mail to a local folder. The ArchWiki has also a quite comprehensive documentation for configuring
offlineimap. An alternative would be
isync (which has also an entry in the ArchWiki)
Additionally, this guide provides an example configuration file for both
offlineimap. (I use Mutt, so this is not my
gnus config, and can't vouch directly for it.)
For POP3, I found
getmail, but i have no experience with that.
Additinally I'd like to point you to this Gnus Manual entry