Не вдаваясь в причину, я в конечном итоге сделал счетчик в переменной сеанса и вышел из подпрограммы из цикла for, если только счетчик не был равен количеству.
Затем все, что после окончания цикла for, которое мне нужно было обновить (Labels, DropDownBoxes), я вставил в их собственные панели обновления с UpdateMode, установленным в всегда.
Чтобы изменить мой псевдокод выше:
Dim iCounter as Integer = Session("counter")
Dim iQuantity as Integer = 10
Protected Sub btnFoo_Click Handles btnFoo Yadda
For i as Integer = iCounter to iQuantity - 1
//do something with AsyncPostBackTrigger until iCounter = iQuantity - 1
//then trigger a full postback
If iCounter <> iQuantity Then
Exit Sub
End If
Session("counter") = iCounter + 1
Next
//Everything else I needed to do with page controls wrapped
//in their own update panels
End Sub
Возможно, не «лучшая практика», но она сработала для того, что мне было нужно.