After several false starts, I realized that the compojure.core/context macro can be used for this purpose. I defined the following macro:
(defmacro read-only "Generate a route that matches HEAD, GET, or OPTIONS"
[path args & body]
`(context "" []
(GET ~path ~args ~@body)
(HEAD ~path ~args ~@body)
(OPTIONS ~path ~args ~@body)))
Which will let you do:
(read-only "/x" [] my-func)
And seems to do what I need.