Использование Where и SkipWhile не приводит к «переходу коллекции дважды». LINQ to Objects работает на модели pull. Когда вы перечисляете комбинированный запрос, SkipWhile начнет запрашивать его источник для элементов. Его источником является Where, поэтому это приведет к тому, что Where начнет запрашивать исходный код в свою очередь для элементов. Таким образом, SkipWhile увидит все элементы, которые передают предложение Where, но они получают их как есть. Результатом является то, что LINQ выполняет foreach над исходной коллекцией, возвращая только элементы, которые передают фильтры Where и SkipWhile, и это включает только один проход по коллекции.
Возможно, существует тривиальная потеря эффективности, поскольку задействованы два итератора, но вряд ли они будут значительными. Вы должны написать код, который будет чистым (как вы это делаете в данный момент), и если вы подозреваете, что чистая версия вызывает проблему с производительностью, то измерьте, чтобы убедиться, что, и только затем попытайтесь объединить предложения.