On parle bien du même problème, sauf que ce que tu vois, c'est une fonctionnalité qui ne marche pas correctement. Ce qu'il faut voir, c'est une erreur de conception dans ton code.
$(window).scroll() permet d'attacher une fonction à un évènement, tu l'as dit toi-même dans la traduction:
"Pour chaque scroll lancer la fonction"
elem.mouseover() et elem.mouseout() ce sont des évènements, ça marche exactement de la même façon.
C'est donc pas "Au survol entrant/sortant de la souris" (sous entendu "tant que la condition dans laquelle on a attaché l'élément est vérifiée"), c'est "La condition a été vérifiée à ce moment précis, on attache donc une fonction à l'évènement mouseover/mouseout, désormais pour chaque survol entrant/sortant de la souris, lancer la fonction".
Tu vois où je veux en venir ?
Il faut soit mettre la condition dans la fonction liée à l'évènement, soit faire un else qui détache la fonction en question lorsque la condition n'est plus vérifiée.
En plus de ça, tu attache tes évènements dans ta fonction .scroll(), ce qui fait qu'à chaque scroll tu attache à nouveau ta fonction pour le hover, au final avec les console.log tu aurais du voir que ta fonction mouseover se déclenche autant de fois que tu as roulé la molette sur le site (au lieu d'une seul fois).
Ce que tu veux faire, c'est pas "à chaque scroll, si l'élément est fixe, ajouter une fonction à l'évènement mouseover".
C'est "à chaque scroll, selon le scroll top, passer l'élément en position fixe ou absolue", et un peu plus loin (en dehors de l'évènement scroll), "si l'élément a la classe mouse_on_off, quand on mouseover sur le bouton, si l'élément est fixe on l'anime".