Here's my implementation. It uses maps and sets to hold intermediate data, and thus is not lazy like your version, but I think it is more readable and will have better overall performance characteristics (your version has quadratic time complexity to realize the results from common-elements).
(require '[clojure.set :as set])
(defn common-elements [& colls]
(let [freqs (map frequencies colls)]
(mapcat (fn [e] (repeat (apply min (map #(% e) freqs)) e))
(apply set/intersection (map (comp set keys) freqs)))))