С академической точки зрения, если это не в продакшен и только похвастаться, можно воспользоваться eval:
$myfunc = eval('return function($x) { return $x['.implode('][',array_map('json_encode',$path)).']; };');
echo json_encode($myfunc($ar)); // {"v":{"a":123,"b":321}}
Тут
array_map('json_encode',$path))
экранирует всякие ковычки и слеши, преобразуя значения в код для их получения
Затем полученный массив с помощью
implode('][',...
превращается в последовательный вызов элементов этого многомерного массива.
А
eval('return function($x) { return $x[...]]; };');
формирует строку функции для вызова этой конструкции и помещает ее в переменную.
Затем остается только вызвать это
$myfunc($ar);
Формально это очень должна быть самая быстрая реализация (сделайте кто-нибудь бенчмарк, для разных размеров ключей и сложности исходного массива), из недостатков только отсутствие контроля за ошибками (чтобы понять, какой именно элемент отсутствует, нужно либо парсить лог ошибок, что рекомендуется, либо добавлять в генерируемую функцию проверки, что сильно замедлит результат)... вроде других проблем не будет, все экранировано.
p.s. если структура $path неизменна для проекта, я бы рекомендовал генерацию кода перед запуском (т.е. прямо .php файлы генерировать) а не во время, это будет еще быстрее и эффективнее, да и поддерживать этот бред будет понятнее.