Сегодня я снова посмотрел на это и обнаружил, что:
[25] pry(main)> how.totp_enabled?
=> false
[26] pry(main)> how.backup_codes_enabled?
=> true
[27] pry(main)> how.totp_or_backup_codes_enabled?
=> true
Так что я попытался удалить также резервные коды, следуя ответу выше от @falco:
UserSecondFactor.backup_codes.where(user_id: id).each(&:destroy!)
Вот полное решение для отключения OTP для пользователя, который потерял доступ: необходимо удалить как записи totps, так и backup_codes, чтобы вызов #totp_or_backup_codes_enabled? возвращал false.