Question: I've always followed the logic: if assert fails, then there is a bug. Root cause could either be:

* Assert itself is invalid (bug)
* There is a programming error (bug)
* (no other options)

I.E. Are there any other conclusions one could come to? Are there cases where an assert would fail and there is no bug?

Answer: 
That's a good question.

My feeling is, if the assert fails due to your code, then it is a bug. The assertion is an expected behaviour/result of your code, so an assertion failure will be a failure of your code.
If you are trying to be logically inclusive about all the possibilities, remember that electronic circuitry is known to be affected by radiation from space. If the right photon/particle hits in just the right place at just the right time, it can cause an otherwise logically impossible state transition.

The probability is vanishingly small but still non-zero.