К сожалению, вы не можете сделать это. Все изменения в UIElements должны происходить в потоке пользовательского интерфейса независимо от того, присутствует ли какой-либо конкретный элемент в визуальном дереве или нет.
Я полагаю, что причина того, что вы не хотите размещать эту логику в потоке пользовательского интерфейса, заключается в том, что она приведет к блокировке пользовательского интерфейса во время вычисления. Один из способов обойти это сделать то, что вы предложили; используйте Dispatcher.BeginInvoke. И вместо того, чтобы просто вызывать вычисление для 1000+ TextBlocks, вы можете вызывать вычисление для одного TextBlock, а затем, когда оно завершится, вызывать следующее и так далее. Вы также можете использовать DispatcherTimer, чтобы планировать, когда что-то происходит. Таким образом, вы разбиваете свои большие вычисления, чтобы пользовательский интерфейс никогда не зависал полностью; конечно, для завершения вычисления потребуется больше времени, но вы делаете это без блокировки потока пользовательского интерфейса на длительный период времени.