There are certainly situations where using a computer to invoke a speed-dial is infeasible. For example, a warehouse phone might be attached to a pilar with no computer in the area. But if a computer is available, you could use a CRM integration to search for a contact and use the browser plugin to make phone numbers clickable. However, defining this as a "speed-dial" implies that searching in a CRM for a contact introduces too much friction.
Still, in my mind, while technically possible, expecting a user to remember 100 different speed-dials seems .... unrealistic. You are doing it now, so I guess it works for your customer, but it seems infeasible to my little brain.
As a compromise to a full-blown CRM integration, perhaps a tiny little PWA application that can be placed on the corner of the screen, or minimized to your taskbar would work? The advantage of using a tiny application is that you can quickly search for a speed-dial by name or number and use the display as confirmation that your memory matches the actual speed dial number. Pressing Enter would initiate the call.

Yes, it would require access to a computer, and that might be a show-stopper. However, I will point out that maintaining the speed-dial list becomes trivial and would not require access to the 3CX console outbound rules. Users could manage the list without depending on the 3CX Admin. You could even pre-filter the list of speed-dials by department or user.
We have a commercial tool (3CX Caller ID) that has a UI that is remarkably similar to your needs and could be used as a template for a custom solution. We provide the ability to manage the list, assign number to departments and users. It would be trivial to repurpose our code to match your needs if this approach would work. Just a thought.