I worked on that for a few days in FIFA 17 and finally fixed it in my game with db edits. It has to do with several things. The closer in overall rating the bench players are to the starting 11 players, the more the AI will sub them in. The worst example of this is the AI will very often play the backup GK if he is rated almost as high as the starting GK, which I think is an actual programming glitch. I found the backup GK had to be rated around 20 points lower than the starting GK before the AI would always choose the starting GK.
Also, the AI will play or early-sub bench players it deems as playing the "correct" position. Say the starting CM is playing RM. The AI will choose to start or sub a bench RM just because it sees that player as the correct player for the position. The LB/RB position logic is the most strict, the AI will always choose an LB or RB over a CB, no matter what the CB is rated. AND will even choose midfielders as LB/RB over CBs. One of the things I did to fix that was set all players' position 1 values as CB, CM or CF, and position 2/3/4 as nil.
There is a team trait value "sticks with regular lineup." You could try setting that and see if it helps. I always set those values to 0, the team traits EA has are quite useless.
EDIT: If POS_BIAS has to do with Weighting of Position Suitable and Overall, then I would set that at 0 and see if that works better. Also, in FIFA 16 team traits were 8 = consistent lineup and 4 = squad rotation. I imagine they are the same for FIFA 18. It might also explain why teams in your game are changing lineups, maybe their team trait is set to 4.