Во-первых, большое спасибо всем принявшим участие!
Во-вторых, рад сообщить, что проблема таки развязалась успешно.
Ну и, в-третьих, если кому интересно, сообщаю: дело, действительно, заключается в работе с очередью. И беда тут в том, что при переходе из одного состояния в другое, эта самая очередь становится временно недоступна (конкретней пока ничего не могу сказать). Поэтому, чтобы все события срабатывали нормально, необходимо, чтобы после срабатывания одного события и перед перехватом другого, вся стейт-машина хоть на мгновение, но попала в состояние IDLE. Для этой цели служит аргумент WaitForIdle в классе ExternalDataEventArgs. Выставляя его в TRUE, Вы определяете, что никакое новое событие не будет рассматриваться до тех пор, пока машине не побывает в состоянии IDLE. В результате все начинает работать корректно.
Еще раз всем большое спасибо!