Ответ 1
Дело в том, что
return (fact 999999999)
немедленно возвращает и не запускает таймаут. Он возвращает бит, который будет оцениваться позже.
Если вы принудительно оцениваете возвращаемое значение,
main = do maybeNum <- timeout (10 ^ 7) $ return $! fact 99999999
print maybeNum
он должен вызывать таймаут (если вы предоставляете стек достаточно большим, чтобы таймаут происходил до).