Заметил пару ошибок в вашем скрипте. Во-первых, $ thread_job, попробуйте это вместо:
[System.Threading.ThreadStart]$thread_job = {ThreadProc};
Вам необходимо заключить скобки в ThreadProc, иначе он будет оценен, а не передан как функция. Во-вторых, вы можете просто указать тип для делегатов, таких как ThreadStart и PowerShell, которые будут преобразовывать вещи для вас; нет необходимости в New-Object.
Во-вторых, CurrentThread является статическим членом - я предполагаю, что $ thread.CurrentThread - опечатка, и вы имели в виду:
$thread.SetApartmentState([System.Threading.ApartmentState]::STA);
Полагаю, у вас все еще будут проблемы с тем, чтобы заставить его работать - всякий раз, когда я пытался использовать потоки в PowerShell до того, как у меня всегда были неприятные сбои без реального объяснения ...
Можете ли вы написать командлет на C # и использовать вместо этого? Возможно, так будет проще - вы можете настроить новое Runspace и выполнить команду в потоке другого Runspace.
EDIT
Найдены следующие ссылки, которые могут вам помочь:
http://weblogs.asp.net/adweigert/archive/2008/04/29/powershell-threading-for-powershell-v1-0.aspx
http://blogs.msdn.com/b/powershell/archive/2007/03/23/thread-apartmentstate-and-powershell-execution-thread.aspx