why is this function firing on all child menu items as well?

The $args parameter are the arguments of the entire menu not of the single menu item, you can see it here in the file itself that uses and executes the filter:

@param stdClass $args An object of wp_nav_menu() arguments.

so when your IF is true (the item is a parent item), you are modifying the entire Menu arguments:

$args->link_after = "</span><span class="caret"><i class="dropdown-indicator"></i></span>";

so all menu items after the parent item would have the dropdown indicator.

If you want to add the dropdown indicator you will have to do the classic custom walker way, where you create your own class:

class Custom_Nav_Walker extends Walker_Nav_Menu{}

and override the start_el function, you will find plenty of info about it.