Partiamo da un (cattivo) esempio: Una combo bindata a 10000 elementi.

Code

   1:  public partial class ComboWithVirtualStackPanel : System.Windows.Window
   2:    {
   3:      public ComboWithVirtualStackPanel ()
   4:      {      
   5:        InitializeComponent();
   6:   
   7:        ObservableCollection<string> data = new ObservableCollection<string>();
   8:        for (int i = 0; i < 10000; i++)
   9:        {
  10:          data.Add("Item "+ i.ToString());        
  11:        }
  12:        this.DataContext=data;
  13:      }
  14:    }

XAML

   1:  <StackPanel>
   2:      <ComboBox ItemsSource="{Binding}" Margin="10"  />
   3:    </StackPanel>

Eseguendo il tutto noterete che la combo impiega parecchi secondi prima di aprirsi questo perchè la combo deve generare tutti gli elementi.
Sostituendo il pannello usato dal controllo per contenere i propri elementi con un VirtualizingStackPanel è possibile velocizzare di molto l'apertura.
Ecco l'equivalente ottimizzato:

   1:  <StackPanel>
   2:      <ComboBox ItemsSource="{Binding}" Margin="10">
   3:        <ComboBox.ItemsPanel>
   4:          <ItemsPanelTemplate>
   5:            <VirtualizingStackPanel  />
   6:          </ItemsPanelTemplate>        
   7:        </ComboBox.ItemsPanel>
   8:      </ComboBox>
   9:    </StackPanel>

Ovviamente la soluzione migliore consiste nell'evitare di mettere così tanti elementi in una combobox.smile_regular