Пробовал так:
function asyncFunc(result) {
	// if (result !== undefined) {
	// 	console.log("then");
	// 	return result;
	// }
	setTimeout(function() {
		console.log("timeout done");
		//asyncFunc("then");
		result = "then";
	}, 2000);
	var startTime = Date.now();
	while(Date.now() - startTime < 3000) {
		if (result !== undefined) {
			console.log("дождались");
			return result
		}
	}
	console.log("превышено время ожидания");
}
В этом случае таймер не срабатывает, пока не завершится цикл.