drupal_render() vs drupal_render_children()?
drupal_render() renders an item. Rendering it contains theming it. Look into function's code, there is this line:

// Call the element's #theme function if it is set


So placing render inside theming function is bound to make a loop. drupal_render_children() exist to break this loop - it renders element's children only, so you can print element itself in theming function and still have children themed by their own proper functions.