8051 Internal Pull-up Value?
Your understanding is fairly close to reality. The 89C51 has 'pseudo-bidirectional' I/Os- quite familiar to ancients who have worked with the NMOS MCS-51 Intel series. There is no input mode vs. output mode - no DDR (TRIS) register. To use a pseudo-bidirectional pin as an input you just write a 1 to the output latch and read the pin state. 

In fact, there is no pull-up resistor per-se rather there is a weak p-channel MOSFET that acts similarly to a pullup resistor. The transistor is made to have a very low Idss so it acts more-or-less like a constant current source when the latch output is high and the pin is lower than a couple volts due to external loading. 







simulate this circuit &ndash; Schematic created using CircuitLab

The maximum current to ground is 50uA, so the Idss of M1 &lt; 50uA. The minimum current at 0.75 Vcc is 25uA and at 0.9Vcc it is 10uA minimum. That brackets the current behavior of the output pretty well. With the output latch set to 1, we have (assuming a 5V supply) :


  Vo = 0V  50uA maximum -> Requiv > 100K with 5V across it
  
  Vo = 3.75 25uA minimum -> Requiv &lt; 50K with 1.25V across it
  
  Vo = 4.5V 10uA minimum -> Requiv &lt; 50K with 0.5V across it 


(I'm getting these numbers  directly off the datasheet)
So it's similar to a 50-100K resistor in behavior. 



You are correct that's much to drive anything when high. In fact it's not even enough to rapidly drive the capacitive load of a trace and a few inputs. For that reason, when the output latch switches from low to high, the transistor M2, which is a 'strong' MOSFET is very briefly switched on to supply the charge current. Then it is switched off and M1 remains on. So a brief spike of current comes out of the pin when it is supposed to go high. That current (through M2 in my schematic) is a maximum of 650uA when the output is at 2V. So M2 behaves a bit like a resistor that is more than 4.6K for the brief time it is on. 

TL;DR

You are correct that the outputs (Ports 1, 2, 3) have very little source drive capability. If you want to switch a lot of current (such as an LED + resistor) connect it between Vdd and the output. You can drive the base of a PNP transistor with base resistor or the gate of a P-channel MOSFET if you need to source a lot of current. Port 0 doesn't have M1 or M2 - it's an open drain I/O.