Patrząc "na oko", to problemem jest asynchroniczność. Jeśli dobrze rozumiem, to next(url) w linii 72 przekazuje docelowy stan url do kolejnego middleware. Kod od 58 do 68 linii wykonywany jest później niż kod z linii 72, stąd niedziałające przekierowanie.
Spróbuj użyć async/await. Przykład (usunąłem Twoje komentarze i dodałem swoje, żeby wyjaśnić zmiany w kodzie):
router.beforeEach(async /* oznacz funkcję jako async, aby móc użyć await */ (to, from, next) => {
let url = null;
function redirect(u = null)
{
url = u
}
//
// reszta kodu
//
if(to.matched.some(record => record.meta.requiredPermissions) && url == null)
{
// poczekaj na wywołanie HTTP
await axios.get('sanctum/csrf-cookie').then(response => {
// zwróć promis z zagnieżdżonego zapytania HTTP
return axios.post('api/check_permissions', to.meta.requiredPermissions)
.then(response =>
{
console.log(response.data)
if(!response.data)
{
// teraz powinno zadziałać, bo całość będzie czekać na zakończenie zagnieżdżonych zawołań do axios
redirect('/')
}
})
})
}
next(url);
})
Swoją drogą, funkcja redirect wydaje się zbędna, bo odpowiada tylko za nadpisanie obecnej wartości dla url.