Personally, I would be perfectly fine with the above code. Not everything needs to be deduped.
But there are alternatives. You can add something like update-last-time-if-newer! or you can put true there instead of the duplicated line and wrap it all in (when ... (update-last-time! current-time)) (assuming you don’t use the result of that if-let currently).
I’d like to add, since you mention a cache, it is often necessary to have some transactional behaviour for that, e. g. using an atom and swap! or swap-vals!.
I think that the duplication is fine. But the code is a bit hard to read because if the when statement is false, (update-last-time! current-time) is never executed. This intent is not clear in the code. I would suggest something more explicit.
I think @DrLjotsson is correct that the intent is not clear, obscuring the code.
I would go a step further and decomplect the do-something action from the update-last-time! action. This makes the intent even clearer, in particular it makes it clearer under what conditions update-last-time! will execute, because you only need to look at a single condition rather than reasoning about how two conditions interact: