Запрос-то асинхронный, но если Вы заметили код
func.result=res;
func();
начинает работать уже после окончания запроса в виде callback-функции. Т.ч. тут с этим все в порядке.
Т.е. проблема не в том, что функция не дожидается ответа от сервера, а в том, что дождавшись она обозначает новый аргумент исходной функции "testFunc" и вызывает её уже с новом аргументом. Но вызывает он ее раньше, чем этот аргумент успел присвоиться.