The processor has to execute something. You will always have an "endless" loop even if you're doing some work in an interrupt handler.
The best solution depends on exactly what you're trying to do.
The main advantage of using interrupts is they allow you to service events in real-time while your main program is doing something else. Timer interrupts specifically allow you to perform some periodic activity on a fairly accurate time-base while doing some other processing.
For most control algorithms it is useful to have some sort of a time-base (or fixed frequency). If that's all your CPU is doing you can easily do that without interrupts by either controlling the number of cycles/instructions in your control loop or polling the timer. Both methods would be simpler and more efficient than using interrupts. Interrupts are more useful in more complex systems doing many things concurrently (I/O, time keeping, scheduling etc.).
If you go with the endless loop without polling the timer or calibrating the time it takes to run one iteration of the loop you will have to be careful of situations where adding more code in your loop changes the timing and the behavior of your control system.
If you implement your control algorithm in a timer interrupt you will have to be careful you're not trying to perform more work than the CPU can handle in one time "slot" or that will again impact the behavior of your control system.