This is something that I have a lot of experience with. I was stuck with a 22.0 second pb average for about 2 years, my junior and senior year of high school. I felt like I was practicing a lot at the time, and it frustrated me that I did not improve despite my perception of hard work to overcome.
In hindsight here are some things I did terribly wrong:
1) In those two years I didn't learn anything new about 3x3x3 speedcubing. I did practice bigger cubes, other puzzles like square-1 and clock, magic, etc. But I didn't learn anything new for 3x3x3 speedsolving. The fact that I was learning to solve other puzzles gave me a false sense of security that I was also learning to improve my 3x3x3, not true!
2) When practicing I only did solve after solve after solve after solve after solve after solve, ad nauseum. I did nothing to try to experiment with other approaches or other methods. I didn't use metronome solving, I just simply solved, logged the time, scrambled and solved again until my hands got sore and I couldn't solve any more. I call this passive practicing. You are practicing yes, but I was re-enforcing my bad habits and not trying to improve them. This period made it very hard for me to break some of my wristing bad habits away to more Nakajima style finger solving only.
3) I did not improve my algorithm sets. I had some terrible speedsolving algs that I was using regularly and did not recognize that I should try to improve them.
----------
Here are the specific changes I made at the end of my rut to get my first ever sub-20 average.
1) Stop Rushing on F2L
If you're stuck in the low 20's I guarantee that you solve F2L too quickly to look ahead. I'm not saying that it's a possibility I am saying absolutely, 100% for a fact you turn faster than you can look ahead. Please try to realize this is true because it will help you speed up tremendously! This one allows for lookahead and allows you to go faster. I still struggle with the perfect balance for this to this very day. It's paradoxical, I know. But seriously, If you go at 80% speed throughout your solving you will get faster times more often than not than if you go 100% speed. Trust me on this. It is one of the biggest changes I made to my solving that allowed me to go sub-20 on average for the first time.
2) I learned X-cross
At this time I was experimenting with Petrus block building, and decided I liked it but did not want to completely give up Fridrich F2L. So I decided to combine the two together and do Petrich for a while. This is building a 2x2x2 block, then immediately finishing the cross edges after that. This approach was told to me by Heath Litton in about 2002 which is where I got the idea. I noticed that sometimes I could literally do the 2x2x2 and the cross at the same time, and thus this gave birth to me trying to purposefully build an X-cross rather than just do it when it was easy to see. So in this sense I was experimenting with an approach that worked for me. I don't have the same turning speed as the pros, so I try to make up for it by making my solving more efficient than most. I now do Xcross on nearly 40-50% of my solves because I practice it all the time and try to refine my technique for it.
If you do have godly turning speeds, then try the "fast and choppy" technique. Maybe you need to solve your pairs in a finger tricky frenzy madness, but then slow down just as you do the insertion to facillitate look ahead. I noticed when hanging out with Daniel Beyer that his turning speed is crazy fast. So I forced him to solve this way for an average and his F2L times actually improved. So you might want to consider this if your turning speed is already very good.
3) Update your algorithms all the time. I don't mean learn new ones so much as learn better ones. I've had lots of times where someone told me about an alg for a case that was "awesome!" but when I tried it I did not like it at all - it just did not fit my style. In this case, learn a different alg. Just because people say "dude this alg R0x0rS!" doesn't necessarily mean it's a good alg for you. Learn algs that you like, not that other people say are popular or fast.
One important thing to note here, learn algs that are fast, not that feel cool. For example I used to use the 17 move Y perm, because it just felt amazingly cool. I now use a 14 move alg because I am faster using it. It was tough for me to change, because I really loved the feel of the 17 move PLL alg, and I was pretty fast with it. However I was more consistently fast with the 14 move version. My goal is to solve quickly, not such that it feels cool, so I changed.
---------------
Yes this message is long so I'll stop now. Hope this helps someone,
Chris