I would prefer the approach where all the work necessary for a particular story is done in the same branch. This approach often reduces some burden of integration, and the work would only need to be synchronized with changes in an upstream development or integration branch for other changes without the need for sharing across feature branches. You would have access to the correct and current state of backend, frontend, integration and end-to-end automated tests.
However, no branching strategy can replace effective communication and collaboration between developers. Effective communication between the front-end and back-end developers would help make sure that the work is well integrated. I would even push for moving toward pair programming where the front-end and back-end developers are working together, at the same time, on the changes, and communicating about what they are finding. Handoffs introduce waste. Finding issues in integration and having to wait is a form of a handoff, as well. Eliminate as many handoffs as possible, with the extreme end having cross-trained developers who can work on all necessary aspects of a story. The use of pair and mob programming strategies can reduce handoffs and help cross-train developers.
The creation of a pull request and who needs to review it depends on your process requirements. You may be able to fully automate your pull request, especially if you are using pair and/or mob programming. You would need to define what the objectives of the pull request are in order to determine if one is needed and who, if anyone, should be human reviewers.