Single.php category entries not showing right colours

You should be running the first piece of code inside your foreach loop. What you are currently doing is to get all the post terms, get the first term object, then passing the custom field value of that term into your foreach loop for every post term.

Your code should look something like this:

$post_categories = get_the_category();
if ( $post_categories ) {
    $separator=" ";
    $output="";
    foreach( $post_categories as $post_category ) {
        $category_color = get_field( 'category_color', $post_category );
        $output .= '<li class="meta-category">';
            $output .= '<a style="color:' . $category_color . ';" href="' . esc_url( get_category_link( $post_category ) ) . '" alt="' . esc_attr( sprintf( __( 'View all posts in %s', 'mytheme' ), $post_category->name ) ) . '">' . esc_html( $post_category->name ) . '</a>' . $separator;
        $output .= '</li>';
    }

    echo trim( $output, $separator );
}

Just a note, always pass the whole term object to get_term_link() and get_category_link() If you pass the ID or slug to these functions, they will make another db call to get the term object, which is totally unnecessary. If you pass the term object (which you already have), no extra db calls are made, so this way you save a lot on resources, specially if you have plenty posts

EDIT

You can also build an array and use implode to display your string

$post_categories = get_the_category();
if ( $post_categories ) {
    $separator=" ";
    $output    = [];
    foreach( $post_categories as $post_category ) {
        $category_color = get_field( 'category_color', $post_category );
        $output[] = '<li class="meta-category">
                         <a style="color:' . $category_color . ';" href="' . esc_url( get_category_link( $post_category ) ) . '" alt="' . esc_attr( sprintf( __( 'View all posts in %s', 'mytheme' ), $post_category->name ) ) . '"> 
                             ' . esc_html( $post_category->name ) . '
                         </a>
                    </li>';
    }

    if ( $output )
        echo implode( $separator, $output );
}