These are interesting code listings and questions, but they conflate the syntactic detail that core.async's go is implemented as a macro, with the semantic intention to support designs around lightweight data flow between independent code blocks.
It might be of value to check out Go, the language, with its channels and go-routines, which were part of the inspiration for core.async. In Go, channels and go-routines are language rather than library features. Go also lacks macros. In that context, answers to these questions are clear: e.g. if you want to run an insert asynchronously and then run a select following the insert in the context of the same transaction, the only way to do it looks like Timothy's example, where the code implements a data flow- the particular data to insert and select is sent over a channel, handled by a function running in a go routine whose semantic purpose is to wait on an input channel, do the database operation, and stick the result on an output channel.
From on the other thread, Go doesn't have exceptions, but error handling between go routines is usually handled with a separate error channel that again serves to support data flow, rather than control flow. Similarly, the reason that a special channel-aware throw wasn't included in core.async is that the idea isn't to use go blocks in a lexical, control-flow sense- even though that's what the implementation expands to- it's to support completely different data-flow oriented designs.
Hope that helps...