An entity will normally have 2 variables that help update it’s position, Velocity & Acceleration. Throughout the frame the user will change these variables and a final new position will be calculated at the end.
The difference is that addForce will normally make a change to the entity’s stored Acceleration whereas addImpulse will make a change to it’s velocity.
They would then normally be used like so:
NewVelocity = Velocity + Acceleration
NewPosition = Position + NewVelocity
This is a simplified example, there would normally be consideration for deltaTime, mass, etc. The reason that example does work is because there are no other forces acting upon it so adding velocity each frame will let it accumulate but this will probably cause problems down the line.
This is the comment from UPrimitiveComponent::AddImpulse source code:
* Add an impulse to a single rigid body. Good for one time instant burst.
… and this from UPrimitiveComponent::AddForce:
* Add a force to a single rigid body.
* This is like a 'thruster'. Good for adding a burst over some (non zero) time. Should be called every frame for the duration of the force.
Also looking at the source code they will both take mass and deltaTime into consideration, you just pass the force you want through, so for regular gravity the force would be 0,0,-980 and that would be passed as the vector every frame for AddForce.
Hope that helps.