Вам следует изменить это на:
.order("COALESCE(CAST(custom_fields.value AS timestamp), custom_fields.value) DESC")
для улучшения читаемости.
Вы сортируете по sortDate, а если он отсутствует, используете createdAt. Всё в порядке убывания. Запрос возвращает данные в точности так, как запрошено: 2020 год «больше», чем второе место в 2011 году.
Если вы хотите, чтобы NULL-значения были в конце, используйте:
.order("CAST(custom_fields.value AS timestamp) DESC NULLS LAST")