Вас ваше выравнивание запроса путает.
UPDATE tablename
SET
name = ?,
domain = ?,
in_chats = usersdata_mirror.in_chats || ARRAY[?]::int[]
WHERE
not(usersdata_mirror.in_chats @> ARRAY[?]::int[]) and user_id = ?
Что будет делать? Обновлять name при каждом вызове? Нет, конечно.
А почему делающий именно это on conflict должен себя вести иначе? where относится не к полю, а ко всему do update.
Если хотите отдельную логику для поля - то в выражении обновления конкретного поля её и напишите.
in_chats = case when ... then ... else usersdata_mirror.in_chats end