Clock usage in the always block and in the event
You have a valid point. If we were being very careful we would want to know if the clock or reset was actually in the X state, and we would probably set Q to X if that was the case.
So why don't we do those checks? The clock and reset are signals that we design very carefully to ensure that they are solid digital signals, with fast transitions from 0 to 1. So, it is often safe to assume that they are never X for a significant length of time.
If you do want to be a careful designer, it is usually better to check for unknown values of clock and reset at their point of origin rather than everywhere they are used. Adding assertions for these signals in just one part of the design allows the simulations to be much for efficient than adding complex if/then/else checks in millions of flip flops.