Поздравляю, ты попался на лямбду.
Лямбды сохраняют ссылки на переменные, а не их значения. 
lambda _: set_default_microphone(index) сохранит ссылку на index, а потому все лямбды будут видеть одно и то же значение index, которое было установлено последним. 
Это можно обойти, сохранив ссылку при объявлении лямбды. Самый простой способ - засунуть сохраняемое значение в значение по умолчанию для неиспользуемого параметра. Значения по умолчанию для параметров вычисляются один раз при объявлении функции, в т.ч. лямбды.
Например, так: 
lambda _, *, ind=index: set_default_microphone(ind)
Ну или даже так: 
lambda _, *, index=index: set_default_microphone(index)