Here is the code based on custom SQL query as suggested by @Rup that should work for you:
// get \'-1 month\' and \'+2 month\' dates as an array(\'YYYY\', \'MMDD\')
$before = str_split( gmdate( \'Ymd\', strtotime( \'-1 month\' ) ), 4 );
$after = str_split( gmdate( \'Ymd\', strtotime( \'+2 month\' ) ), 4 );
// if the before/after years are the same, should search for date >= before AND <= after
// if the before/after years are different, should search for date >= before OR <= after
$cmp = ( $before[0] == $after[0] ) ? \'AND\' : \'OR\';
// SQL query
$users = $wpdb->get_col( $wpdb->prepare(
"SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = %s AND (SUBSTRING(meta_value, 5, 4) >= \'%s\' %s SUBSTRING(meta_value, 5, 4) <= \'%s\')",
\'date_of_birth\', $before[1], $cmp, $after[1]
));
Update
Maybe I misunderstand your question looking at your code. The above code would give the list of users whose birthday passed no more than month ago or will happen no more than two months after the current date. To get the list of all users which have their birthday this month or next month, use the following code:
$current = gmdate( \'m\' );
$next = sprintf( "%02d", $current % 12 + 1 );
$users = $wpdb->get_col( $wpdb->prepare(
"SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = %s AND (SUBSTRING(meta_value, 5, 2) = \'%s\' OR SUBSTRING(meta_value, 5, 2) = \'%s\')",
\'date_of_birth\', $current, $next
));