The App Access Checker is giving you the answer directly , License = No is your real problem, not the security role configuration.
System Administrator bypasses license checks, which is why it works. The moment you remove it, the license validation kicks in and blocks visibility.
Do these two things first:
Check the user's license in Microsoft 365 Admin Center , confirm they have a proper Dynamics 365 Sales Enterprise license assigned. A Power Apps or Team Member license won't work here, even if it partially functions elsewhere.
Compare your custom role against the original Salesperson role , not just the business table privileges like Accounts/Contacts, but also the non-business/miscellaneous privileges that are easy to miss when copying a role.
A quick way to confirm which is the culprit , temporarily assign the out-of-the-box Salesperson role to the user without any custom role. If Sales Hub becomes visible, your custom role is missing something. If it stays invisible, the license is definitely the issue.