Stop Duplicating Terms in a Foreach Loop

I would tend to do this:

$terms = array();
$terms_tags = wp_get_post_terms( $query->post->ID, array( 'post_tag' ) ); 
foreach ( $terms_tags as $term_tag ) {
  $terms[$term_tag->slug] = '<button class="filter" data-filter=".'.$term_tag->slug.',">'.$term_tag->name.'</button>';
}
echo implode($terms,', ');

It leverages the fact that PHP does not allow duplicate array keys, and thus avoids the overhead of function calls.

In your case, it should look like this (without all of that PHP tag spam):

$query = new WP_Query( $args ); ?>
<div class="entry-content units-row group">
  <div class="category-list category-list-video-archive">
    Filter by tags:
    <button class="filter" data-filter="all">Show All</button><?php 
    $terms = array(); 
    while ( $query->have_posts() ) : 
      $query->the_post();
      $terms_tags = wp_get_post_terms( $query->post->ID, array( 'video-arc-tags-taxonomy' ) );
      foreach ( $terms_tags as $term_tag ) { 
        $terms[$term_tag->slug] = '<button class="filter" data-filter=".'.$term_tag->slug.'">'.$term_tag->name.'</button>';  
      }
    endwhile; 
    echo implode($terms,' '); // this goes outside the while loop ?>
  </div><!-- .category-list -->
</div><!-- .entry-content -->