Абсолютно - строить набор вместо проверки списка каждый раз:
// Change string to whatever the type of UserID is.
var oldUserSet = new HashSet<string>(oldList.Select(o => o.UserID));
var newUsers = NewList.Where(n => !oldUserSet.Contains(n.UserID))
.ToList();
Проверка сдерживания для HashSet
должна быть O (1), предполагая несколько коллизий хешей, вместо O (N) проверки каждого на всю последовательность (для каждого нового пользователя).