Как получить темы, отсортированные по значению пользовательского поля iso8601?

Вам следует изменить это на:

.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")