You can avoid granting unique permissions if provide access to all tickets. You can restrict the information they see managing list views and form sets.
If that is not an option and if the external users should not be involved into the discussion, but just provide some information to the initial request, you can install another HelpDesk site for communication with them. When a ticket is created on the main site or if it is modified in a certain way (for example a certain value is set in a certain field), create a new ticket on the second site. You can tie the ticket on the main site with one on the additional using list or library control in the ticket form.
If that does not suit you too, the last thing I can suggest is the following.
First, create a custom lookup field in the 'Tickets' list that refers to the 'Title' column of the 'Contacts' one, in fact it is a clone of the 'Requester' field. Name it 'Contractor', for example. Fill that field if the ticket should be exposed to the external user from the third party.
In the widget configuration, create a custom view. Replace the 'Requester' field with the newly created, for example:
<And>
<Eq>
<FieldRef Name='Contractor' LookupId='True' />
<Value Type='Lookup'>{{Me.ID}}</Value>
</Eq>
<Neq>
<FieldRef Name='InternalStatus' />
<Value Type='Text'>Solved</Value>
</Neq>
</And>
They should provide all the required information in the comment they post. If the comment should not be visible by the requester and CC contacts in the ticket, create a trigger started on adding a comment and put it above all other triggers, especially above notification ones. If the comment is added by one of those external users, change its type to private.
If some of the provided information should be added to a ticket field necessarily, the contractor can mark it with special characters right in the comment body. For example:
This is a regular text.
#This text should be saved in a field#
This is some further text
Then start a Power Automate flow on item creation in a 'Comments' list. If the comment is from one of the contractors, split the comment body string by #
and use the second item in the result array to fill the required field. Marking can be complicated to distinguish what field each string should be added to.
It is just a general concept to see if that will work for you. If so, we can elaborate each step together.