I assume that you are asking about LINQ to Objects, and so the Select call in your code corresponds to Enumerable.Select(..).
LINQ to Objects operators themselves do not explicitly block the executing thread. However, they do allocate memory: for example, the ToArray operator will allocate larger and larger arrays in order to buffer up the results.
And, memory allocations can result in thread blocking. When you allocate memory, the CLR or the OS may need to acquire some lock in order to locate a chunk of free memory. Even more importantly, the CLR may decide to run garbage collection (GC) any time you allocate memory, and that can result in significant thread blocking.
If server GC is a good fit for your application, you can try turning it on and see if the throughput improves. Also, you can often write non-LINQ code that performs fewer memory allocations than a LINQ to Objects query. In your particular example, I believe that LINQ to Objects will start producing the results into a small array, allocating a larger array any time the results don't fit. Your custom implementation may be able to allocate the array of the right size right at the beginning, avoiding a bunch of unnecessary allocations.