TitleExists allows extensions to override a title existence check, ie. tell the caller that the page is in the database, even though it isn't. This is an obviously bad idea without detailed rules of when and how this is allowed to be done (such rules are entirely absent), and leads to issues like T265665 or T119827. The hook was introduced in T72495: TemplateSandbox doesn't handle things like #ifexist and Scribunto's getContent as a hack for pretending during edit preview the that page that's just about to be created exists (so if you e.g. create a page with {{#ifexist:{{FULLPAGENAME}}|yes|no}}, it would behave identically during preview and after creation); that is a valid use case but should be exposed in a more narrow way.
Currently used in one place in core, ParserOptions::setupFakeRevision() (which could use a dedicated mechanism shared only with Title instead of a hook), and one extension known to CodeSearch, TemplateSandbox, which uses it for previews. So probably the way to go would be to add ParserOptions::setTitleExistsCallback(), along the lines of ParserOptions::setCurrentRevisionRecordCallback(), and if possible move the code calling the callback from Title::exists() to whatever calls that method within the parser.