Просто обрежьте каждое до начала месяца:
private static DateTime TruncateToMonth(DateTime date) =>
new DateTime(date.Year, date.Month, 1, 0, 0, 0);
Тогда вы можете использовать:
// TODO: Null handling
return TruncateToMonth(source) >= TruncateToMonth(response)
? Outcome.Pass()
: Outcome.Fail();
Обратите внимание на TODO - я не пытался обрабатывать нулевые значения совсем. Я никогда не могу вспомнить правила достаточно четко, чтобы предсказать, что будет делать ваш текущий код. Если я не могу понять это, не концентрируясь, шансы на то же самое будут относиться к любому другому, кто пытается прочитать код тоже :) Так что я бы сделал действительно ясным, как вы хотите обрабатывать нули, например,
return source == null || response == null ? Outcome.Fail()
: TruncateToMonth(source.Value) >= TruncateToMonth(response.Value) ? Outcome.Pass()
: Outcome.Fail();
Как отмечается в комментариях, вам не нужно усекать исходное значение - я просто нахожу более понятным, если вы это сделаете.