Combined looping and recursion when implementing Quicksort, using proper Clojure style
We are far from from beta-reduction here. The "reduction" can only be
  understood using explicit instruction flow semantics.


No. You have chosen to interpret loop and recur in this way, but that is not how Clojure understands them. 


recur is simply a flag for a tail-recursive call, functional as you like.
loop is a gloss on defining and applying a function.


We could define loop as a macro in terms of fn:

(defmacro loop [bindings &amp; expressions]
  (let [[bindees values] (-&gt;&gt; bindings
                              (partition 2)
                              (apply map vector))]
    `((fn ~bindees ~@expressions) ~@values)))


The real loop macro checks the syntax of bindings. I've not bothered. And it handles destructuring explicitly. I've left it for fn to do.