Вы убедились, что занимает так много времени? это вызов CoInitializeEx ()? Вам определенно не нужно вызывать CoInitialize один раз для каждой задачи. Вы также не говорите, сколько потоков вы порождаете, т.е. если вы работаете на двухъядерном процессоре и ваша работа интенсивно использует процессор, не ожидайте более чем двухкратного ускорения, и если ваша работа не CPU затем интенсивно ожидает некоторого ресурса (памяти, диска, сети), и ускорения будут аналогичным образом ограничены, возможно, усугубятся, если для этого ресурса будет удерживаться блокировка.
Если вы можете использовать Visual Studio 2010, взгляните на библиотеку Parallel Pattern Library и Asynchronous Agents Library, есть пара инструментов, которые могут помочь сделать это меньше кода для написания.
Если вы не можете, вы можете, по крайней мере, попытаться поместить токен в TLS, который представляет, был ли COM инициализирован в этом потоке, и использовать присутствие этого токена для обхода ваших вызовов CoInitialize, когда они не нужны. *