Проблема в том что если в самой функции делаете echo да ещё и рекурсию, то не нужно результат работы функции помешать внутрь другого
echo так как в таком случае сперва отрабатывает функция, и делает echo, а потом уже отрабатывает внешнее echo.
Чтобы избежать этого, и вставлять функцию как вы хотите, нужно изменить код функции так чтобы вместо echo там был return;
Исправленный код с echo.
<?php
function draw($array)
{
foreach($array as $item)
{
if(isset($item['CHILD']))
{
echo '<li>'.$item['NAME'].'<ul>';
draw($item['CHILD']);
echo '</ul></li>';
}
else
{
echo '<li>'.$item['NAME'].'</li>';
}
}
}
$arr = [
'CHILD' => [
'16' => [
'NAME' => '1',
'CHILD' => [
'17' => [
'NAME' => 'a'
],
'18' => [
'NAME' => 'b'
]
]
]
]
];
echo '<ul>';
draw($arr['CHILD']);
echo '</ul>';