Методы HttpWebRequest, похоже, делегируют часть своей работы потоку пользовательского интерфейса.Вот часть трассировки стека из ситуации взаимоблокировки:
...
System.Windows.dll!System.Net.Browser.AsyncHelper.BeginOnUI(System.Net.Browser.BeginMethod beginMethod, System.AsyncCallback callback, object state) + 0x9b bytes
System.Windows.dll!System.Net.Browser.ClientHttpWebRequest.BeginGetResponse(System.AsyncCallback callback, object state) + 0x25 bytes
...
Обратите внимание на BeginOnUI после BeginGetResponse.«Асинхронный» обратный вызов фактически синхронизируется с потоком пользовательского интерфейса и поэтому зависает, когда поток пользовательского интерфейса заблокирован.Методы HttpWebResponse могут выполнять такую же синхронизацию.