You keep track of the speed by using two variables, rather than one, and then use those two variables to determine the "actual" vector speed. The difference is that you aren't accelerating the whole speed (both x and y-velocities), just the velocity of one direction (y-velocity). This way your y-acceleration does not affect the x-speed, and so the angle will work as intended. It's just an implementation of CreateShotA_XY with some extra stuff. Hell, you could even do exactly what you want by deleting the bullet on contact with the wall and then using A_XY to make a new one, but you asked how to do it with one object.
Obj_SetPosition fails when you're using bullet graphics like arrowheads and rice that need to turn based on angle, because Set_Position doesn't affect graphic angle. It would be more or less the same as below, but with different calculations.
I pretty much gave you everything you needed. You're supposed to read and try to understand what I wrote and then use it to implement it yourself rather than me just giving you the code, which would have been easier on my part. There's a reason I explain these things. Anyways...
let obj = Obj_Create(OBJ_SHOT);
Obj_SetPosition(obj, x, y);
Obj_SetSpeed(obj, s1); //this is initial θA
Obj_SetAngle(obj, a1); //this is initial c
//etc
while(!hitwall){ yield; } //wait until bullet hits wall
let a2 = (180 - a1) % 360; //horizontal reflection
let xvel = cos(a2) * s1; //x-velocity after bounce
let yvel = sin(a2) * s1; //y-velocity after bounce
//note, you don't need a2 anymore
while(!deleted){
Obj_SetSpeed(obj, (xvel^2 + yvel^2)^0.5); //this is your new c
Obj_SetAngle(obj, atan(yvel / xvel)); //this is your new θA
yvel += accel; //increases only y-velocity, hence pseudogravity effect
yield;
}