カスタムフィールドiso8601値で並べ替えてトピックを取得する方法

これを以下のように変更することをお勧めします。

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

可読性向上のためです。

sortDate でソートし、それが存在しない場合は createdAt を使用します。すべて降順です。クエリは要求通りデータを返しており、2020 年は 2011 年の 2 位よりも「大きい」ためです。

NULL を最後にしたい場合は、以下のようにします。

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