Unfortunately, because you keep taking him back in and he's figured out how to lie and steal from you without much consequence, he's unlikely to change his behavior. It's oddly working out okay for him.
It's hard to set boundaries with our kids, particularly when we feel badly for them and worry about their mental health, but sometimes you have to say "no" and let them find their own way. And yes, that may mean he could end up in dire straights, but until he has to fend for himself and face the consequences of his behaviors, he may not at all be willing to seek the help he needs because, again, you basically keep bailing him out.
Give him a firm timeline. Full-time job by X date AND contribute to rent and bills and food. If he can't follow through, then he has to leave and find his own place to live and finance his own life. He's 21 and it is time. If he is unwilling to do that, he needs to go out on his own. It will be perhaps a harsh wake-up call, but right now you are enabling this immaturity by funding it.
We had to be pretty firm with our middle child (but fortunately no drug or stealing issues). Get a job and start paying rent. He knew we meant it, and he had a job within a few weeks. He continued to pay rent, clean, and help with groceries until he eventually moved into a house with his partner. We were fine with him being with us so long as he was a contributing member of the family.
I've known several people who simply had to cut off their adult kids because of drugs, theft, abuse, etc. Those adult kids went through some hard adjustments, but most of them figured it out when they had to. Right now your son doesn't have to because he knows you are still fixing things for him.