Мой оригинальный ответ был выключен. После некоторого исследования вот настоящая причина и ссылки:
Это потому, что вы запустили свой WCF ServiceHost в потоке пользовательского интерфейса.
Как известно любому, кто занимался многопоточным программированием пользовательского интерфейса в Windows, вы не можете обновить пользовательский интерфейс без синхронизации обратно с потоком пользовательского интерфейса, используя что-то вроде метода Control.Invoke.
По умолчанию WCF ServiceHost обрабатывает все запросы в своих собственных потоках из пула потоков. Однако при запуске WCF ServiceHost в потоке пользовательского интерфейса WCF обнаруживает, что поток пользовательского интерфейса имеет связанный с ним SynchronizationContext. WCF обнаруживает это и вместо того, чтобы использовать пул потоков для обработки запроса, отправляет все входящие запросы в поток пользовательского интерфейса. Это объясняется тем, что код компонента WCF-сервера может безопасно обновлять интерфейс.
Таким образом, даже если ваша служба WCF может вообще не взаимодействовать с пользовательским интерфейсом, WCF будет использовать этот механизм из-за запуска в потоке пользовательского интерфейса.
Простое исправление - применить атрибут ServiceBehavior, для которого UseSynchronizationContext имеет значение false. Или запустите ServiceHost в другом потоке (как вы обнаружили).
Вот еще несколько деталей:
http://bytes.com/topic/net/answers/750778-wcf-inproc-client-server-main-thread-client-call-hangs
http://www.softinsight.com/bnoyes/PermaLink.aspx?guid=4bea53fa-2553-4d7b-bfe2-b0f0e9d11d0a
Извините за оригинальные заблуждения. Надеюсь, это поможет.