seems good enough to me. What’s wrong with using regex?
You could cut down a bit by using an inner group, I think:
(string/replace "/foo/{bar}/car/{var}"
#"(\{([^\}]+)\})"
(fn [[_ _ token]]
(str ":" token)))
then the function gets [full-match, outer-group, inner-group]
as its input.