I haven't read all the responses but I agree with GrandmaSarah's post. DS4 was getting really difficult to deal with and I was crying daily. One day he was in timeout and said "I don't know why you put me here!!! It doesn't do any good!"

Right then and there I said "OK, that is fine. No more timeouts. From now on I will treat you like you are 7 and EXPECT Choices from you that reflect the behavior of a 7 year old". He looked stunned but pleased. From that moment things changed dramatically.

I really feel in many ways he felt belittled by the fact I was treating him like the 4 year old he really is...the fact is, he is not mentally like a 4 year old....not even close. The fact that I did treat him like 4 and all that entails made him angrier and angrier to the point that he was acting out, had angry outbursts multiple times a day.
I don't know what you do in your home but in case you don't, try telling him and treating him like the older child he mentally probably is. That means he will have to step up and make the right choices.

I just say, "You will have to make a 7 year old choice or I will have to start treating you like a 4 year old again". That is all it takes to get him back on track.

Instead of timeout I ask him to go to his room because behavior like that is not acceptable in our house. I tell him to come out when he is ready to make better choices.

Hang in there.