When you move an object with its transform, you're telling Unity "I don't care about colliders or physics or whatever, just put the object exactly HERE" and it will obey, wedging the object right through solid colliders if you tell it to.
If it has a Rigidbody, then on the next physics step the physics engine will try to do its best to clean up the mess, finding some impulse that will take this object (which is ostensibly stationary - it didn't have any forward velocity carrying it into the wall, it just teleported itself there with its transform) and move it outside of the colliders it's penetrating.
If it's really wedged in there, then that impulse can be quite large, resulting in objects launching out out from each other. Or it could get wedged so deep that the smallest impulse that resolves the collision is to push it out the other side, so the object tunnels right through a solid barrier (the physics engine doesn't know this shouldn't be possible, because there's no velocity information telling it which direction the object impacted from, so pushing it out either side seem like equally plausible ways to resolve this teleport)
If the object has no rigidbody, then its movement is not influenced by the physics engine, and no collision police will enforce that colliders should mean anything to it. You're on your own to use the transform responsibly to put the object where you actually want it. If you pass it right through a collider, well, that's what you told Unity you wanted it to do. Who is it to argue?
Add a rigidbody and do not touch its transform. Move it solely via rigidbody methods like AddForce, velocity, AddTorque, MoveRotation, etc.
This way the motion remains under the control of the physics engine and it can stop the object when it begins to hit something and process the collision correctly, rather than doing its best to clean up after a teleportation accident.
Keep your transform-based movement, and take on responsibility for avoiding interpenetration in your own script. That may mean casting rays, boxes, or other shapes to determine how far into its motion the object can go before penetrating another collider, and positioning it at the nearest non-intersecting point.
This gives you complete control of its physics if you want it to behave in ways the normal physics sim does not out of the box (eg. if you want something exaggerated & cartoony), but it can increase the complexity of your code if you need to model more complicated physical interactions yourself, like the torque from striking a wall corner-on, or the push imparted to a pile of debris objects as you try to drive through them.