The following happens when using mix:
org.clojure/clojure "1.8.0", org.clojure/core.async "0.3.443"
This is due to how the go loop driving the mix is alerted to changes. The change notification goes on a channel that is then thrown in a collection with all the channels in the mix, and the go-loop does an alt on all the channels in that collection. alt is non-deterministic choice, so this means in theory the change channel could never be read, and the go-loop just goes on its way never getting changes.
This problem is exacerbated when the input channels are ready with lots of inputs as in the example above.
fiddling with using priority can help alleviate this, but to some degree you will always be able to get at least one value from the c1 channel in the example above in the first read from mch, because the copying loop (from the channels in the mix to the output of the mix) reads from the channels and then blocks on writing to the output (in the example) which means it may have already read from c1 by the time c1 is paused.