Вы можете использовать значение Max для массива и сравнить его с Datetime.now.
Важные советы: Обратите внимание, что .First () означает не только первый элемент (более того, эластик не сохраняет элементпорядок в индексации).Анализируется весь массив (но, действительно, оператор. Field является оператором Or, поэтому не работает с вашим случаем, может работать с родительским предложением must_not bool, кстати).
private QueryContainer AddExpiredOffersFilter(QueryContainerDescriptor<AttractionDocument> query)
{
query.DateRange(d => d.Field(f => f.Offers.Max(r => r.Expires)).GreaterThan(DateTime.Now));
return query;
}