get_posts query matches too many results

Well, you need to include the type comparison, or alphanumeric comparison is applied here.

In this case, you should add 'type' => 'numeric'.

Using Your Class Function

<?php
public function list_related_docs($id){

            $docs_args = array(
                    'post_type'     => 'publication',
                    'post_status'   => 'publish',
                    'posts_per_page'=> -1,
                    'orderby'   => 'meta_value_num title',
                    'order'     => 'ASC',
                    'meta_key'  => 'fund_list_order',
                    'limit'     => 4,
                    'suppress_filters' => 0,
                    'meta_query'    => array(
                        'relation'  => 'AND',
                            array(
                                'key' => 'funds_id',
                                'value' => $id,
                                'compare' => '=',
                                'type' => 'numeric',
                            ),
                            array(
                                'key' => 'fund_list_order',
                                'compare' => 'EXISTS',
                            )
                        )
                    );
            $docs_posts = get_posts($docs_args);
            // more stuff
}