This is true for guards, middle relays, and of course exits, but less so for bridges, since their IPs are not published globally like other relays are. The people maintaining block lists can't block what they don't know.
That's extremely insidious. I suppose I never encountered this issue because I almost always call asyncio.gather(*), which makes having a collection of tasks natural.