壁がsolidだった場合、collisionイベント実行前に前の位置に戻されるから
abs(hspeed)>1 だったら、壁と自分との間は1以上空いていることになる。
だからplace_meeting(x-1)ではヒットしないと予想。
place_meeting(x+/-hspeed)にしてみたらどうよ?

whileの押し戻しもたぶん成功してないと思うな(単にxpreviousに戻されてるだけ)
厳密にやるなら x = other.bbox_right + 1 + sprite_xoffset とかの方が良さそう