You shouldn't use array comprehension in this case. It's a bit slower than high-order functions and can't be parallelized.
Though I would prefer @ildjarn's solution, here is an equivalent solution to your C# one:
// You need an uninitialized array to fill in later
let newItemArray = Array.zeroCreate items.Count
// Fill in the array in a parallel manner
Array.Parallel.iteri (fun i v ->
(* create object here - complex operations *)) newItemArray
You can also use Parallel.For
directly:
let newItemArray = Array.zeroCreate items.Count
Parallel.For(0, items.Count,
(fun index ->
(* complex stuff here *)
newItemArray.[index] <- Object())
) |> ignore
It's more verbose but gives you more control over degree of parallelism.