In functia menu() tu iei inputul de la user in user_input dupa care te bagi direct in while loop.
Valoarea user_input nu se poate schimba niciodata pt ca tu esti blocat in while:
def menu():
user_input='fara valoare' # intrii in loop cu o valoare default
while user_input != 'q':
user_input = input("*inside joke*: ") # inputul in citesti in interiorul loopului
if user_input == 'a': # cand while se executa a 2-a oara promptul de input se executa din nou
print("ai tastat a")
elif user_input == 'b':
print("ai tastat b")
else:
print("nu stii sa tastezi?")
#nu mai are rost aici sa mai citesti input
Sper sa intelegi tu cum functioneaza while-ul. Daca inca nu te prinzi incearca un step-by-step debugging. (http://pythontutor.com/)