On what hook can I get the queried object’s final state?

I think your conception of how hooks work is slightly off. If you are outputting something that contains the URL and title of the queried object, then this isn’t something you’d typically need to worry about.

You bring up two types of filters that you’re concerned about: using pre_get_posts, and filtering titles.

In the case of pre_get_posts, this does not modify the queried object. This hook is used to modify what query is performed based on the queried object. The queried object itself does not change. For example if the user visits the URL to category “Foo”, but a plugin uses pre_get_posts to change the query so that this category returns posts that belong to category “Bar”, the queried object is still “Foo”, and other elements of the page, such as the page’s <title> tag will still use “Foo”. In this situation you would still want the details of “Foo”, to match the title tag, so the queried object is what you’d use.

So you don’t need to worry about pre_get_posts. What about other filters that could affect the queried object? The important thing to understand is that these filters do not modify the state of the queried object.

For example, let’s say the queried object is a WP_Post object, with the title “Foo”. Even if a plugin is running that uses the the_title filter to modify all post titles to be “Bar”, the post_title property of WP_Post will still be “Foo”. This is because these filters do not modify the state of the object. Instead, The way these filters work is that they are applied on output. In the case of post titles this is done via the get_the_title() function, which runs the post_title property through any registered filters each time it’s used.

So if you wanted to get the title of the queried object for a page, and respect any filters that have been added by other plugins, this would be incorrect:

$title = get_queried_object()->post_title;

Instead use the correct function, which will apply 3rd-party filters to your value:

$title = get_the_title( get_queried_object() );

Or manually apply the filters yourself:

$title = apply_filters( get_queried_object()->post_title, get_queried_object_id() );

So basically this boils down to: Don’t worry about the “state” of the queried object, or what the latest hook is to do this or that. Instead just make sure you’re using the correct functions and APIs to get the data you need, and your plugin will also reflect any changes made by other plugins.