WHERE (user_id = 17 OR user_id IS NULL) AND name = "menu_items"
Y solo para limpiar el resto de la consulta:
El id en las preferencias definidas no es necesario que esté allí, use una clave combinada de preference_id y user_id en su lugar.
Si el id de preferences fue nombrado preference_id , el largo ON declaración podría ser reemplazada con USING(preference_id)
El IF la función se puede reemplazar con COALESCE(defined_value, default_value)