Yes - unsigned arithmetics in C is pretty straightforward, it's just the expected operations modulo 2^N.
So yes, subtracting two unsigned timer values (for instance) is guaranteed to be correct even if the timer overflowed (and so wrapped around) between the two timestamps (as long as it overflowed only once).
More correctly end - start is correct if and only if fewer than 2^N ticks have elapsed between them.
Yes, that was obviously implied by the modulo 2^N arithmetics: results are always modulo 2^N, so must be strictly less than 2^N to be correct. Otherwise the true result will be result + k* 2^N with k >= 1.
So that works only if the elapsed time is strictly less than 2^N. No way around it. Check that this assumption always hold true in a given use case, and all you need is just unsigned subtraction.
Wrapping once is bad if end has also gone past start since then.
modulo 2^N arithmetics guarantees that the subtraction will be correct as long as the actual difference is strictly less than 2^N, as we said above. Once that guarantee holds, 'end' cannot wrap around and become equal to or greater than 'start' after having wrapped once. It's just not possible. It happens only if the actual difference is greater than or equal to 2^N.
So if elapsed time is < 2^N and 'end' happens to wrap, the subtraction is correct. That's the point that many people often seem unsure of.
Of course, if you can't guarantee that elapsed time between timestamps is strictly less than 2^N, then you have to handle timer overflow properly, and that will usually be equivalent to implementing an extended timer (counting overflows as a most significant part of the timer), and you have to guarantee that you can count overflows that without the timer overflowing more than just once in between successive overflows.