Hello,
I'm still a newbie with core.async myself, but I'll try to answer anyway, learning on the way ;-)
My idea is that you could leverage alts! which can return a default value immediately if none of the operations is "ready". I think "ready" means "would not wait/park" (there's either a value to be read in an input channel, or room in a channel buffer of an output channel).
So it's not really a channel that will have the feature, but rather a process. I guess it is easy to encapsulate the desired behaviour by hiding the process behind a function taking the desired output channel, and returning a channel exhibiting the encaspulated behavior:
(defn put-or-drop-channel [target-channel]
(let [input-channel (chan)]
(go-loop
(when-let [v (<! input-channel)]
(alt! [target-channel v] nil :default nil))))
?