Why do my custom post types stop displaying over time?

So Why?

Because your WP_Query/query is querying the recent posts for your post type (for all meal types), so the results would likely not (always) contain those posts where the meal_type meta contains emergency as part of the value.

Yet, your code below is only displaying the post if it’s of the specified meal type, which is emergency in your code:

$meal_type = get_field('meal_type');
if ( $meal_type && in_array('emergency', $meal_type))

Solution

Use meta query in your $args:

$args = array(
    'post_type'  => 'meal',
    'meta_query' => array(
        array(
            'key'     => 'meal_type',
            'value'   => '"emergency"',
            'compare' => 'LIKE',
        ),
    ),
);

A bit of explanation: In the above meta query, we’re using the LIKE clause because the meta value is an array with a serialized string which may look like a:1:{i:0;s:9:"emergency";} in the database, so we’re using an exact match — "<the type>". And it should work with your current ACF settings, but you’d need to adjust the value accordingly for other meal types. E.g. With the “basic” meal type, you’d use 'value' => '"basic"' (note the quotes/" are necessary).

A Better Practice

I would create a custom taxonomy named meal_type and assign it to the post type (meal). Or I might just use the default Category (category) taxonomy. But either way, I wouldn’t need to use the above meta query, or that it’s easier to query by the category/taxonomy and categorizing is what taxonomy is meant for. So you should consider that before you create more posts..