If by "without assuming repeatable failures" you mean:
... I replace my subjects when they fail, [thus] the replacements start a new lease of life $t_0$ on the previous replaced subject's failure
then you have reset the time to 0 on the survival curve for the replacement subject. If you assume that a replacement subject introduced at $t_1$ (in the original time scale) has the same survival curve starting from its own placement into the study as the one that was replaced had from its starting $t_0$, what matters is the time going forward from that replacement time. So if you do a replacement at $t_1$ in the original time scale, instead of calculating $H(t_2)-H(t_1)$ based on a survival curve starting from the original $t_0$, you would use the cumulative hazard from
time = 0 up to the difference in time from the new start time up to the new end time, $(t_2 - t_1)$, or $H(t_2-t_1)$ in your terminology.
If your "replacements" don't have the same survival patterns as the original subjects
A survival model can take into account different types of events that represent different underlying survival patterns. For example, if your initial subjects have different survival patterns from their replacements (and potentially on to further differences between those initial replacements and their own later replacements, etc.) you can create a multi-state survival model that distinguishes among events for initial subjects, their replacements, etc. That will take some care in setting up, as instead of a simple event/censored indicator you need to specify a factor variable that distinguishes among event types (failure of original subject, failure of a first replacement, failure of a second replacement, etc.) and both a start and stop time corresponding to the times over which each type of event was at risk.
The multi-state model vignette for the R survival package shows how to set up such models based on your understanding of the subject matter.