Try taking out length check and allowing the forEach to run.
For the length function to work out how many items are included in the iterator it must call next() on the iterator until it gets to the end. There is no way to rewind an iterator, so by the time you get to your forEach there are no items left.
If you need to know the length you can use a varStatus object:
<c:forEach var="child" items="${children}" varStatus="status">
<li>${status.index} here${child.path}</li>
</c:forEach>
You are using a newer version of Sling than me, but this works for me if I feed the results of ResourceResolver.listChildren into a c:forEach without the ${fn:length(children)}