Gostaria de deixar a minha resolução dos desafios, e comentar que acredito que o desafio 3, de verificar se palavra ou frase é um palíndromo, me parece complexo demais para o nível de conhecimento passado pelas aulas até o momento.
Desafio 1: é bem simples, basta  adicionar um confirm dentro de uma condicional. Decidi utilizar um return para interromper a execução do código caso não o usuário clique em "não".
    // Confirma se o jogo deve ser mesmo devolvido
    if (imagemDoGame.classList.contains('dashboard__item__img--rented')) {
        if (!confirm(`Tem certeza que deseja devolver ${nomeDoJogo}?`)) {
            return;
        }
    }
Desafio 2: não ficou claro se o intuito era incrementar um contador ou contar quantos jogos dentre os disponíveis foram alugados, decidi fazer da segunda forma:
function jogosAlugados() {
    let jogosAlugados = 0;
    const listaJogos = document.querySelectorAll('.dashboard__items__item');
    
    for (const jogo of listaJogos) {
        if (jogo.querySelector('.dashboard__item__img').classList.contains('dashboard__item__img--rented')) {
            jogosAlugados++;
        }
    }
    console.log(`Jogos alugados: ${jogosAlugados}`);
}
Desafio 3: utilizei um filtro usando Regex para deixar apenas caracteres alfanuméricos, e, por sorte, verifiquei que esse filtro também removeu acentos. A verificação foi feita caractere a caractere, utilizando um loop for. Também fiz validações caso não fosse digitado nada, e caso o filtro resultasse em uma string vazia, e adicionei um confirm para permitir reiniciar a execução.
verificarPalindromo();
function verificarPalindromo() {
    const string = prompt('Digite uma palavra ou frase para verificar se ela é um palíndromo');
    let palindromo = true;
    
    // Verifica se uma palavra foi digitada
    if (string !== null && string !== '') {
        const stringFiltrada = string.toLowerCase().replace(/[^a-z0-9]/g, '');
        const tamanho = stringFiltrada.length;
        if (tamanho) {
            for (let i = 0; i < tamanho; i++) {
                if (stringFiltrada[i] !== stringFiltrada[tamanho - 1 - i]) {
                    palindromo = false;
                    break;
                }
            }
        } else {
            palindromo = false;
        }
    
     
        alert(`"${string}" ${palindromo ? 'é' : 'não é'} um palíndromo.`);
    } else {
        alert('Nenhuma palavra foi digitada')
    }
    const reiniciar = confirm('Deseja verificar uma nova palavra?');
    if (reiniciar) verificarPalindromo();
}
Desafio 4: utilizei um loop while para validar se o valor digitado era mesmo um número válido, utilizando o fato de que parseInt retorna NaN caso ele não consiga transformar o valor em número
escolher();
function escolher() {
    alert('Escolha 3 números');
    const num1 = verificar('Primeiro número:');
    const num2 = verificar('Segundo número:');
    const num3 = verificar('Terceiro número:');
    // Converte array em string, e adiciona espaço entre os itens
    const numerosOrdenados = ordenar(num1, num2, num3).toString().replaceAll(',', ', ');
    alert(`Números ordenados: ${numerosOrdenados}`);
    // Reinicia se o usuário desejar
    if (confirm('Deseja executar novamente?')) escolher();
}
// Verifica se o valor digitado é um número válido e o retorna, caso contrário repete a escolha do número
function verificar(msg) {
    let numero = prompt(msg);
    numero = parseFloat(numero?.replace(',', '.'));
    while(Number.isNaN(parseInt(numero))) {
        alert('O valor digitado não é um número válido');
        numero = prompt(msg);
        numero = parseFloat(numero?.replace(',', '.'));
    }
    return numero;
}
// Retorna array com números ordenados
function ordenar(num1, num2, num3) {
    return [num1, num2, num3].sort();
};