Т.е. вы сами загнали себя в рамки Task.Run и async/await, а затем спрашиваете почему же так. Task.Run не гарантирует запуск всего в отдельных потоках, на деле будет очередь и ThreadPool. А использование await в итоге выстраивает всё в очень малое кол-во потоков. Тут надо по старинке делать, старыми механизмами, будет более эффективно. BeginGetResponse/BeginGetRequestStream вам помогут и потоков много не потребуется.