Wow, this sounds like me and my recent practice partner. he hits a really flat 2hbh and heavy topsin forehand, while I hit a relatively flat forehand and spinny 1hbh.
My main tactic against him when I'm in control is to limit the time he gets to hit his forehand:
First I try to rip a ball to his forehand to draw a loopy ball relativley in the centre of the court. Then I try to wrong-foot him by hitting either a short-angle forehand or forehand down the line. if the ball comes back to my forehand side or the centre, I repeat that pattern until I can approach the net. If it comes back to my backhand, I run around it and try to wrong-foot him with combinations of inside-out/in forehands.
My tactic against him when he pins me to my backhand is to act defensive, give him a rhythm, and then surprise him:
I mass slice to his backhand, and then suddenly loop one to his backhand, rip one down the line or dropshot him. If he ever breaks the pin and attacks my forehand, I just use his pace to hit a short-angle crosscourt forehand, which usually puts me in control so I can use my first tactic. Eventually, he'll anticipate this, so you can wrong-foot him by deflecting the ball down the line instead of short-angle crosscourt.
Considering that this heavy topspin player is on the same level as the OP, if not higher, this won't work. Also note
im pretty agressive, and i think i hit a tad harder than him.
This means the amounts of pace both players generate is pretty close.
What we can infer from this is that trying to rip balls to draw a short loopy response in the middle of the court will require the OP to hit MUCH HARDER than he actually can. Not only that, but when hitting your hardest shots, you take a risk and lower your percentages of getting the ball in play (how much varies from player to player and level to level).
There's a lot I disagree with tactically in your post, but you can use whatever works for you and the people you play. But bottom line, I think you're playing well below your level. Like 4.0 vs 3.0. I don't know many 4.5s who'd risk ripping balls all day just to draw a single short ball out. Or maybe I'm thinking 5.0s... Either way, I just don't like all the risks involved in constantly ripping balls for a single short ball. It's gotta take at least 5-10 shots before you get anything. Maybe 10-20 even... Not work the risk.
Now, there are several things he can do, and should probably take a few of them and try them out at the same time.
-Take the ball on the rise
-Fall back and take it on the drop
-Avoid the forehand
-Rally patiently
-Change up spins, depth, and height
-Change up pace
-Play back a lot of heavy topspin shots of your own
Simplest single change in your game will always be just to take the ball on the rise. It requires better footwork, but that benefits your game in the long run. Plus, your ability to return serve will improve.
Just move your feet more quickly to get into position to hit the ball. Focus on nothing but playing a safe shot deep crosscourt.
If you're feeling pushed back, your biggest problem is footwork and how you set your body. If that's the case, tell me and I'll throw down what you should focus on there, but I won't type that much unless necessary.
If you can't handle the heavy topspin and have no way to practice against it, then your only choice is to be a smart tactician on court. One thing you must realize is that the heavy topspin he is using will significantly cut down on his error count. As such, this means you must also cut down on your own errors while still playing shots to make him hit errors or get short balls.
So how do we do that? For one, you can trade deep heavy topspin shots all day long until someone makes an error. I have a feeling he'd win this contest otherwise you wouldn't be asking us for advice. Another option is to mess up his rhythm, balance, and positioning, which will mess with his consistency and improve your chances of out-rallying him. Change up the spins, the height, the depth, and the pace of the ball. Let him get into a little bit of a groove, then hit a drastically different shot. By letting him get into a groove, I mean play 3-5 of the same shot, then hit one drastically different. I don't mean play 20 then change. While that would be a better surprise, you can do much more in a point by doing something else in the same amount of time. You want to lower his consistency as much as possible so you don't have to hit 20 shots. You want to drop his consistency down from 50+ balls before an error to around 10. Just playing aggressively to win the point under match pressure, he drops to around 20-30 as it is. The final option is to blow big bombs all day long. Not a good option by any means. This immediately drops your consistency to 5-10. But once you reach the very top levels of tennis, this becomes a very good option because your serve will (should) always set up the short ball.
So you have to think about how to put together a point that will win a good majority of points played. If you can't handle his forehand at all, play to his backhand. Do whatever you can that will allow you to rally deep for as long as possible while also doing things that will prevent him from doing the same. That's all there is to it. But bottom line, I suggest improving your footwork and taking balls on the rise. This increases your tolerance to his shots. Heavy topspin shots really shouldn't present much of a challenge unless your opponent's above your level and hitting it at speeds you can't handle. In that case, it's a mere level difference where his rally balls are much faster than yours. As you get better, heavy spin won't be as big of a bother unless it's hit with incredible pace, in which case you're more concerned with the pace than the spin, because the pace is the real problem. Solution: get in position faster!