Skimming through the comments, I haven't fallen in love with the thread-first operator, but I'm unfamiliar with it. Perhaps I'd become more used to it in time.
I would sometimes do this:
(def recstring (test s (o start 0))
(let helper (afn (i)
(and (< i (len s))
(or (test i)
(self (+ i 1)))))
(helper start)))