Isso mesmo! O Else é opcional assim como o Elif também é opcional. A utilização deles vai depender do que você quer fazer no seu código. Algumas vezes você vai querer um else no seu códígo, outras você só vai precisar do if mesmo.
Quanto a sua ultima duvida, vamos por partes.
for restaurante in restaurantes:
if nome_do_restaurante == restaurante['nome']:
restaurante_encontrado = True
restaurante['ativo'] = not restaurante['ativo']
mensagem = f'O restaurante {nome_restaurante} foi ativado com sucesso' if restaurante['ativo'] else f'O restaurante {nome_restaurante} foi desativado com sucesso'
print(mensagem)
if not restaurante_encontrado:
print('O restaurante não foi encontrado.')
Nesse código tem um for loop certo? O que estiver endentado no for , será executado dentro do for. O if not restaurante_encontrado não está endentado no for, quer dizer que ele não faz parte do bloco for . Nesse código então, primeiro o bloco do for loop é executado e depois o if not restaurante_encontrado é executado.
Então não é necessário, este ultimo if not restaurante_encontrado estar endentado. Um if não necessariamente depende de uma outra condição pra ser executado, na verdade você está criando esta condição. Agora se você tiver um caso que tenha uma primeira condição e apartir dela você queira testar uma segunda, terceira ou infinitas condições kkk, ai sim você precisar endentar os ifs.
Vou dar um exemplo hipotetico de quando a gente precisa endentar o(s) if(s):
#variavel
numero1 = 8
# você quer saber se é menor que 10
# por algum motivo você quer testar se é igual a 8
if numero1 < 10:
if numero1 == 8
print("Este numero é 8!!!")