Meta query field order together with post_date order causes posts without the meta field to be unordered

Actually, I don’t think you need that mt1.post_id IS NOT NULL DESC sorting, hence you also do not need to use the posts_orderby hook. You can just use the orderby parameter in WP_Query like so:

Also note that, in the first meta query clause named/keyed start_date_value, you should set the type arg to DATE (like you can see below) so that MySQL/MariaDB casts the meta value as a date and then properly sorts the posts by date.

$meta_query = [
    'relation'         => 'OR',
    'start_date_value' => [
        'key'  => 'start_date',
        'type' => 'DATE', // set the 'type' to DATE
    ],
    'start_date'       => [
        'key'     => 'start_date',
        'compare' => 'NOT EXISTS',
    ],
];

$query->set( 'meta_query', $meta_query );

// Use an array with the orderby.
$query->set( 'orderby', [
    'start_date_value' => 'DESC', // sorts by the meta start_date
    'post_date'        => 'DESC', // then sorts by the post date
] );

And as I said in the comments, you should understand that when sorting by multiple columns like above where the columns are the start_date meta and the post date, values that are already sorted in the previous column won’t be sorted again, unless for values that are equal like the 20200211 (start_date) below. You can try a demo on DB Fiddle which outputs this:

---
**Query #1 - before sorting **

| Post Title    | start_date | Post Date              |
| ------------- | ---------- | ---------------------- |
| News 1        | 20200211   | March 12th, 4:00AM     |
| News 2        | 20200926   | September 19th, 5:36AM |
| News 3        |            | June 5th, 8:07PM       |
| Publication 1 | 20201021   | October 16th, 5:40PM   |
| Publication 2 | 20200211   | March 12th, 11:43AM    |

---
**Query #2 - after sorting by the meta start_date **

| Post Title    | start_date | Post Date              |
| ------------- | ---------- | ---------------------- |
| Publication 1 | 20201021   | October 16th, 5:40PM   |
| News 2        | 20200926   | September 19th, 5:36AM |
| News 1        | 20200211   | March 12th, 4:00AM     |
| Publication 2 | 20200211   | March 12th, 11:43AM    |
| News 3        |            | June 5th, 8:07PM       |

---
**Query #3 - after sorting by the meta start_date, AND THEN the post date **

| Post Title    | start_date | Post Date              |
| ------------- | ---------- | ---------------------- |
| Publication 1 | 20201021   | October 16th, 5:40PM   |
| News 2        | 20200926   | September 19th, 5:36AM |
| Publication 2 | 20200211   | March 12th, 11:43AM    |
| News 1        | 20200211   | March 12th, 4:00AM     |
| News 3        |            | June 5th, 8:07PM       |

Note though, the demo doesn’t use the full WordPress database schema, but I just wanted to demonstrate the multiple columns sorting. And I hope that demo and this answer helps you? 🙂