I have a very similar situation to this post
PHP: nested menu with a recursive function, expand only some nodes (not all the tree)
and I need some help...
Plenty of detail in your question, that's great.
Looking at the code, the first issue I see is with the line:
if ($value['Parent'] == $parent) {
The first time you enter the foreach loop, $value['Parent'] is NULL, and $parent is 0.
Because you are doing a == comparison, this evaluates to TRUE. Try instead:
if ($value['Parent'] === $parent) {
Note the ===. This also checks the data type and requires it to match as well.
The second issue will then be with the line:
if ($has_children === false && $parent) {  //if children is false but parent is not null, this is a sub item
The comment makes it clear that you want to check that $parent is not null, but you aren't doing that, you are casting the integer value of $parent to a Boolean, so 0 will be treated as FALSE, and anything else as TRUE.
Try instead:
if ($has_children === false && !is_null($parent)) {  //if children is false but parent is not null, this is a sub item.
                                                                        As I agree with @Tim Withers I start to solve problem from preparing current array:
function prepareMenu($array)
{
  $return = array();
  //1
  krsort($array);
  foreach ($array as $k => &$item)
  {
    if (is_numeric($item['Parent']))
    {
      $parent = $item['Parent'];
      if (empty($array[$parent]['Childs']))
      {
        $array[$parent]['Childs'] = array();
      }
      //2
      array_unshift($array[$parent]['Childs'],$item);
      unset($array[$k]);
    }
  }
  //3
  ksort($array);
  return $array;
}
Some explanation.
Then function to build menu:
function buildMenu($array)
{
  echo '<ul>';
  foreach ($array as $item)
  {
    echo '<li>';
    echo $item['Name'];
    if (!empty($item['Childs']))
    {
      buildMenu($item['Childs']);
    }
    echo '</li>';
  }
  echo '</ul>';
}
With this and proper array order, no matter how deep rabbit hole is - you have your tree.
Usage:
$menu = prepareMenu($menu);
buildMenu($menu);
Of course... There must be better way... :-P
EDIT:
For array (a little midification [next child]):
$menu = array(
array(
        'Menu_IDX' => '1',
        'Order' => '1',
        'Name' => 'History',
        'Parent' => '',
        'Path' => 'History',
        'Link' => '',
    ),
array
    (
        'Menu_IDX' => '2',
        'Order' => '25',
        'Name' => 'Review',
        'Parent' => '',
        'Path' => 'Review',
        'Link' => 'Review',
    ),
array
    (
        'Menu_IDX' => '3',
        'Order' => '35',
        'Name' => 'Past Medical History',
        'Parent' => '',
        'Path' => 'Past Medical History',
        'Link' => 'Past Medical History',
    ),
array
    (
        'Menu_IDX' => '4',
        'Order' => '45',
        'Name' => 'Item 1',
        'Parent' => '0',
        'Path' => 'Item 1',
        'Link' => 'Item 1',
    ),
array
    (
        'Menu_IDX' => '5',
        'Order' => '55',
        'Name' => 'Item 2',
        'Parent' => '0',
        'Path' => 'Item 2',
        'Link' => 'Item 2',
    ),
array
    (
        'Menu_IDX' => '6',
        'Order' => '65',
        'Name' => 'Item 3',
        'Parent' => '0',
        'Path' => 'Item 3',
        'Link' => 'Item 3',
    ),
array
    (
        'Menu_IDX' => '7',
        'Order' => '65',
        'Name' => 'Item 31',
        'Parent' => '5',
        'Path' => 'Item 31',
        'Link' => 'Item 31',
    )
);
Output will be: