For example can an approximation algorithm call a subroutine which is solving a NP-Hard problem? (like say its trying to find the longest path in some graph as an intermediate step) Is that allowed?
Depends. Typically, with "approximation algorithms" people understand algorithms that run in polynomial time and return a possibly non-optimal solution (with a formal guarantee on the solution quality). In this definition, no, you can't spend exponential time solving an NP-hard problem.
On the other hand, nothing is forcing you to consider polynomial time algorithms that return non-optimal solutions. In fact, it is interesting to consider algorithms that take exponential time, and still return non-optimal solutions. See for instance [1, 2].
It depends entirely on what complexity you want your algorithm to have. For example, if you're trying to approximate an EXP-hard problem then a polynomial algorithm that uses an NP oracle might be acceptable; if you're trying to approximate something that's only NP-hard, using an NP oracle more than once would be potentially more expensive than just solving the problem exactly.