cannot filter after using pre_get_posts

The problem is that you always set the meta query, if you don’t want it to apply in a particular situation, you need to check for that situation and account for it. Similar to how you’re already checking with is_admin, or is_main_query, etc.

In this situation, you’ll want to check the $_GET parameters to detect if the filter has been applied on the posts screen, and only set the meta query if it isn’t present. In this case, I believe the parameter used is m, but there are several others in the URL to check against

Further notes:

  • When you get the filter working, you probably won’t see the results you’re expecting as that filter works on the publish date. If you’re expecting to see applications filtered by date, you’ll need to detect when a filter is happening and add a different meta query that queries app_date via those filter arguments, then undoes the default filter
  • Filtering posts via their post meta is expensive! Really, really expensive! Treat these as a rare thing you only do occasionally. I’ve seen major sites brought down by simple post meta queries, it puts a big strain on the database. That’s why taxonomy tables were created, otherwise, categories and tags would be stored in post meta. If you can repurpose the publish date, that’ll make a huge difference.
  • You’re not using a standardised format for your date values. Not only that but they’re ambiguous! Use YYY-MM-DD instead and follow the ISO standards agreed upon, and you’ll get better compatibility
  • Consider specifying that your values are dates using 'type' => 'DATE'
  • You can make the function easier to read and modify by separating out those conditionals into guards and exiting early, e.g. if ( !is_admin() ){ return; }, this also makes debugging easier, and lets you test each check individually if things go wrong

There is also a bug in your code, that is unrelated to your issue, but still a bug. The code checks if the current query is for a particular post type, but because it uses an assignment operator = instead of a comparison operator ==, instead of checking if they match, it sets/assigns the value. As a result, all queries are now queries for apps. This is unrelated to the issue in your question.