Initially I tried to work with SelectionFilter (TypedValues) only and select the entities via editor.selectAll(SelectionFilter), since its performance is great. But there are some limits, e.g. I can't filter for entities with certain XData.
So I switched to work with Predicates (Expression<Func<Entity, Boolean>>) that also can be combined via PredicateBuilder. The mapping from ObjectIDCollection to Entities is as you suggested:
IEnumerable<Entity> ents = objIds.Select(id => tr.GetObject(id, OpenMode.ForRead)).Cast<Entity>();
The predicate is applied afterwards:
IEnumerable<Entity> appliedEnts = ents.AsQueryable().Where(predicate);
This solution provides for me the most flexibility with only a little lack of performance, since I only need to open one Transaction.
Thanks!