Как работает функция построения дерева?
судя по распечатке массива, где-то ошибка: функция предполагает, что в неё передаётся хэш ( то есть массив, у которого ключи - значимы), а у вас приведён список ( ключи не несут информации ).
Может, поэтому и непонятен результат работы функции. $arr должен быть таким:$arr = [685 => [
    'id' => 685,
    'title' => 'Комплектующие к Apple',
    'parent' => 0
  ],
  691 => [
    'id' => 691,
    'title' => 'Запчасти к iPad',
    'parent' => 685
  ],
  692 => [
    'id' => 692,
    'title' => 'Запчатси к iPhone',
    'parent' => 681
  ]
];
Плюс в последнем элементе подозрительное значение у ключа parent ( больше подходит 685 ).
if(!$node['parent']) {
      $tree[$id] = &$node;
    }
если у текущего элемента нет предка, значит, вы помещаете текущий элемент в $tree по ссылке. То есть, изменение этого элемента в $tree повлияет на $dataset и наоборот, изменив этот элемент в dataset вы измените tree. 
рекомендую заменить первую строку в фрагменте кода, который я выделил, на     if(!isset($node['parent'])) {
далее:$dataset[$node['parent']]['childs'][$id] = &$node;
если предок есть (то есть, это не рутовый элемент), вы добавляете в изначальный dataset информацию о том, что у его элемента, идентификатор которого равен предку текущего элемента, есть child, и заносите туда текущий элемент. Поскольку перед этим вы сохранили в tree элемент node по ссылке, то эта операция также изменит и структуру переменной tree.
Обратите внимание, что, убрав & из выделенного фрагмента, вы получите тот же результат, что и с ним.