È quello che logicamente verrebbe da pensare anche a me, ma se tu inserisci un codice di questo genere:
codice:
    Private Sub Form1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Click
        For c As Integer = 1 To 10000
            Label1.Text = c.ToString()
            Label1.Refresh()
        Next
    End Sub
Vedi nella label i numeri che scorrono tranquillamente. Sto facendo un po' di ricerche con ILDASM su come può funzionare una cosa del genere, e ho visto che all'atto pratico Refresh richiama Invalidate e Update
codice:
.method public hidebysig newslot virtual 
        instance void  Refresh() cil managed
{
  // Code size       14 (0xe)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldc.i4.1
  IL_0002:  call       instance void System.Windows.Forms.Control::Invalidate(bool)
  IL_0007:  ldarg.0
  IL_0008:  call       instance void System.Windows.Forms.Control::Update()
  IL_000d:  ret
} // end of method Control::Refresh
Update a sua volta richiama l'API UpdateWindow
codice:
.method public hidebysig instance void  Update() cil managed
{
  // Code size       29 (0x1d)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldfld      class System.Windows.Forms.Control/ControlNativeWindow System.Windows.Forms.Control::window
  IL_0006:  ldarg.0
  IL_0007:  ldfld      class System.Windows.Forms.Control/ControlNativeWindow System.Windows.Forms.Control::window
  IL_000c:  callvirt   instance native int System.Windows.Forms.NativeWindow::get_Handle()
  IL_0011:  newobj     instance void [mscorlib]System.Runtime.InteropServices.HandleRef::.ctor(object,
                                                                                               native int)
  IL_0016:  call       bool System.Windows.Forms.SafeNativeMethods::UpdateWindow(valuetype [mscorlib]System.Runtime.InteropServices.HandleRef)
  IL_001b:  pop
  IL_001c:  ret
} // end of method Control::Update
La MSDN a tal proposito dice questo:
The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT message to the window if the window's update region is not empty. The function sends a WM_PAINT message directly to the window procedure of the specified window, bypassing the application queue. If the update region is empty, no message is sent.
Che la parte evidenziata c'entri qualcosa con tutto questo? Qui c'è bisogno della conferma di qualcuno più esperto di me...