Hoje olhei para isso novamente e descobri que:
[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
Então, tentei remover os códigos de backup também, seguindo a resposta acima de @falco:
UserSecondFactor.backup_codes.where(user_id: id).each(&:destroy!)
Agora, aqui está a solução completa para desabilitar o OTP de um usuário quando ele perdeu o acesso: você deve remover tanto as entradas de totps quanto as de backup_codes, para que a chamada a #totp_or_backup_codes_enabled? retorne false.