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