Como buscar tópicos ordenados pelo valor do campo personalizado iso8601?

Você vai querer mudar isso para:

.order("COALESCE(CAST(custom_fields.value AS timestamp), custom_fields.value) DESC")

para melhorar a legibilidade.

Você está ordenando por sortDate e, quando esse campo está ausente, usa createdAt. Tudo em ordem decrescente. A consulta está retornando os dados exatamente como solicitado, pois 2020 é “maior” que o segundo colocado de 2011.

Se você quiser que os valores nulos apareçam por último, precisa usar:

.order("CAST(custom_fields.value AS timestamp) DESC NULLS LAST")