That's O(N^2). Each time a timer expires, the code linearly scans the table for the next timer. You can do a lot better than that. The really good solution, O(log N) with an upper bound, was developed in 1987.[1] The better algorithms all involve tree structures, as you'd expect.
Timers have unique properties which permit more optimal solutions. A hierarchical timing wheel is O(1) to start, O(1) to cancel, and O(1) to expire.
Finding the next minimum timer isn't O(1), but you don't actually need to know that information to process the timing wheels. It's O(1) to figure out the next _set_ of timers to process. They're populating a shared bucket. If they're in a higher-level wheel you would need to linearly search them to find the minimum. But normally you only care about when the next cascade operation needs to occur, which is the minimum within the granularity of that wheel, and _that's_ O(1).
See "Hashed and Hierarchical Timing Wheels: Data Structures for the Efficient Implementation of a Timer Facility" by George Varghese and Tony Lauck. And specifically appendix A for the O(1) expire.
In somewhat of a defense of "Implementing Software Timers", the code seems to be for an embedded system in 1990, as hinted at by the disabling of interrupts. Chances are it will not have hundreds of timers, and that code size may be more important than efficiency.
This is an excerpt from a book "Obfuscated C and Other Mysteries", one of the stranger programming books I've ever owned. About half the chapters are discussions like this one -- taking a (relatively) small, practical programming task and going into detail how to address it. There's a grab-bag of subjects, and it doesn't even adhere strictly to C, as a couple of chapters discuss the use of Tcl in C programs. The majority of the book, however, discusses the winners of the first few years of the International Obfuscated C Code Contents. He not only presents the source code and explains what they do, but he also goes into some detail (sometimes great detail) as to how they work. There's nothing else like it that I know of, and it is one of my favorite programming books of all time.
[1] https://en.wikipedia.org/wiki/Order-maintenance_problem [2] http://www.cs.cmu.edu/~sleator/papers/maintaining-order.pdf