Блокировки из таймерных функций захватывать можно в том смысле, что никакими deadlock'ами это не угрожает. Если для захвата блокировки потенциально требуется длительное время, тогда это
Какой-то поток должен выполнять код таймерных функций. Создавать для каждого вызова специальный поток слишком накладно. Создавать при загрузке специальный поток для всех таймерных функций неудобно в силу того, что при текущей организации потоков/процессов это ещё один элемент таблицы слотов, который в CPU будет уже третьим процессом по имени OS/IDLE.
При чём тут события, я не поняла. Можно набросок того, как это, по-твоему, должно выглядеть? Можно на псевдо-Си.
P.S. Скорее всего, это моё последнее сообщение на этой неделе, так что до понедельника.