Why do we need external pulling resistors when microcontrollers have internal pulling resistors?
There are a few possible reasons, such as


Needing the resistor to be present during power-up, as the microcontroller will not yet have started executing.
Needing a more precise resistance than the internal resistor. Internal pull-up/-down resistors have very wide tolerances.
Needing a resistance larger or smaller than that provided internally. For example, I2C typically uses stronger pullups, while you might want a very weak pullup for monitoring a switch, to save power.
Needing to pull to a voltage other than the microcontroller's supply voltage or ground.
Using a pull-up/-down resistor along with the ADC on the microcontroller. Some microcontrollers disable their internal resistors on any pin the ADC is connected to.
Needing a pulldown resistor on a microcontroller that only has pullups.