You can see where the issue comes in. If I want to display this information then every time the page refreshes it makes (internal call + per email = total calls) a lot of calls.
This can be mitigated by storing the data in a separate place but then the information won't be the newest.
Is there a better way to get the subject line and clicks for each email without making soo many calls?
I would highly recommend that you store the data as a sort of cache and then display on the page that the data will be updated in "x minutes". Performing live calls per user introduces more issues. There isn't anything that HubSpot provides that will make your life easier if your requirement is perfectly live data.
In the background, your system can be pinging the HubSpot API at a more healthy rate while also keeping rate limiting in mind.