سلام و درود @Farshad
نکته اول اینه که هوک pre_get_posts از نوع اکشن هست نه از نوع فیلتر.
فک میکنم کد زیر برای موردی که گفتید جواب بده.
add_action('pre_get_posts', 'remove_old_cat_posts', 1);
function remove_old_cat_posts($query) {
if($query->is_main_query() && ($query->is_home() || $query->is_front_page())) {
remove_action('pre_get_posts', 'remove_old_cat_posts', 1);
$my_query = new WP_Query(array(
'cat' => 31,
'post_status' => 'publish',
'posts_per_page' => -1,
'date_query' => array(
array(
'before' => '1 mon