Earlier in org-capture-fill-template, there is the following:
(ct (org-capture-get :default-time))
The property :default-time defaults to the current time and is overwritten by file+datetree+prompt,
If ct was passed as a 2nd argument to format-time-string in your code snippet:
;; The current time
(while (re-search-forward "%<\\([^>\n]+\\)>" nil t)
(replace-match (format-time-string (match-string 1) ct) t t))
this should provide the behavior I'm looking for with file+datetree+prompt, but still use the current time for other capture types. Will this solution break anything?