Ok so I think taking a step back, I think their is some complecting going on here. I don't see how you see "that invoking a map without arguments evaluates it" as a generalization. I believe Rich's intention behind map's, set's, and vector's being callable is that they naturally behave as primitive (mathematically) functions, which map a key space to an output space. So first, there aren't any natural meanings for calling a map with zero arguments. (If anything, I think it should return nil. Because sometimes we would call functions using apply like (apply f [a b c]), and sometimes that list is empty, like (apply {} []). This is just like how (+) evaluates to 0. But I digress...).
What you are generally talking about is controlling code evaluation. You are specifically storing code within the values (and potentially keys) of the map. Really, this code is just lists, aka data. It is really important to keep the phases of evaluation separate, otherwise this makes macro writing very confusing (and coding in general). What you are suggesting complects calling a map (keys to values), with evaling a map (recursively eval any non quoted lists). These are separate actions/ideas. When we do want to operate in different phases, then we really do want to call eval explicitly as this is a "dramatic" action. Eval takes literal data and pipes them through unless they are lists, where it treats the first arg as a function/special-form, and the output can be very different from the input. In contrast, often transformations on maps result in other maps. My take here is, again, this should be explicit. In your intended behavior example (({}) :b), it is calling eval behind the scenes. This is very hidden and leads to very different performance implications. My take is you are suggesting reducing code size but not actually addressing duplication, and in the process making special behaviors less intuitive. (One other thing is what you suggest doesn't blend nicely with -> as you'd still have to call .invoke at the end instead of just calling eval.)
-----
To support your cause, however, I think there are many tools to help you with code manipulation and code analysis during runtime.
If you want your code to work as is but have code analysis phases, you can use macros to insert code analyzing phases without impacting the evaluation and runtime implications of the code itself.
For example:
(def code-size (atom 0))
(defmacro count-code [some-code]
(reset! code-size (count (str some-code)))
some-code)
(count-code {:a :b}) ;; => {:a :b}
@code-size ;; => 7
From there, you can write code analysis walkers as functions (not macros) and use them at runtime with explicit quoted forms at the repl, or insert them into your macros for analyzing "production" code.