Depending on what you're doing in your loop, and how busy your CM machine is while you're executing this, you could look into implementing your loop logic using Parallel.ForEach
Do be aware that this will possibly hammer your server's CPU and your database too.
UPDATE
Using GetList is unfortunately not an option with Tridion 2011. In Tridion 2013 this code does work:
UsingItemsFilterData f = new UsingItemsFilterData {ItemTypes = new[] {ItemType.Component}};
IdentifiableObjectData[] items = client.GetList("tcm:1043-7444-8", f);
foreach (var item in items)
{
ComponentData component = (ComponentData) item;
//Do something
}
UPDATE 2
Given that using Tridion 2013 is not an option here, then what I would try to do is to give the user the perception of speed - even if it's not that fast...
Not knowing exactly what you're trying to do - though it seems like it is linked to content validation from your comments - and assuming that you display results in some form of grid, I would try to use AJAX and CoreService async calls to update the list as the components get loaded and validated. This will add complexity to your code, but increase scalability without annoying your editors (it is usually fine if it takes longer to do something as long as you start showing results quicker).
Yet another option would be to validate your content on save, "mark" the components with a specific Application ID in AppData, then use this information to limit the number of components you need to load (you can get all components with a specific ApplicationID in one call).
IEnumerable<IdentifiableObject>
)