В обычном приложении WPF все объекты пользовательского интерфейса связаны с одним диспетчером, а диспетчер связан с одним потоком. BeginInvoke асинхронно запускает указанный делегат в потоке, связанном с диспетчером (в случае диспетчера пользовательского интерфейса это будет поток пользовательского интерфейса). Вам нужно только вызвать BeginInvoke (или Invoke, который совпадает с BeginInvoke, но блокирует) из потока, отличного от потока пользовательского интерфейса.
Если вы хотите обновить пользовательский интерфейс из кода, запущенного в потоке ThreadPool, получите ссылку на диспетчер пользовательского интерфейса и вызовите BeginInvoke или Invoke, и он перенесет вызов в поток пользовательского интерфейса.