A (cancellable) context is mostly just a channel, which is closed as a broadcast signal, wrapped in an interface. I don't think that how you pass it around makes any difference, including sending it over another channel.
Aside: it can be argued that "worker pool" is an anti-pattern in Go. Goroutines are so cheap that there's very little point in re-using them; you might as well just create one, let it do some work then terminate. Of course you want to limit the amount of *concurrent* work that is done, but there are other ways to achieve that. If there's stuff you need to keep around from task to task, like a persistent database connection, then maybe "worker pool" still makes sense.
This is covered in the talk "Rethinking Classical Concurrency Patterns" by Bryan C. Mills:
It's all well worth watching - keep the pause and rewind buttons under your fingers! Code at 32:15 shows limiting concurrency amongst goroutines, giving worker-pool-like behaviour but without leaving idle goroutines lying around.