Puedes encender los leds como dices poniendo a cero (que no es conexión directa a tierra) o a uno el pin (que tampoco es conexión directa a Vcc).
Mirando el datasheet, si miras Vol (output low) te dice que el voltaje máximo que puedes encontrar cuando se pone como salida es de 0.9 V, por lo que no es una conexión directa a tierra, y como Voh (output high) una tensión mínima de 4.2 V, por lo que tampoco es una conexión directa a Vcc. No es un GND, ni un Vcc, es un 1 ó 0 lógico con sus umbrales. Hay componentes en medio que llevan el pin a Vcc o a Tierra, y la intensidad que puede absorber o proporcionar el puerto/pin depende de la que soporten esos componentes. En este caso no hay diferencia entre suministrar corriente y absorberla.
Si vas al datasheet del AVR te dice que es 40 mA, pero no especifica en que caso, será para ambos.
ATmega328p
DC Current per I/O Pin ............................................... 40.0 mA
DC Current VCC and GND Pins................................ 200.0 mA
La suministrada y absorbida por todos los pines del micro no puede exceder los 200 mA.
Si vas al datasheet de un pic 18f
Maximum output current sunk by any I/O pin..........................................................................................................25 mA
Maximum output current sourced by any I/O pin ....................................................................................................25 mA
Maximum current sunk by PORTA, PORTB, and PORTE (Note 3) (combined) ...................................................200 mA
Maximum current sourced by PORTA, PORTB, and PORTE (Note 3) (combined)..............................................200 mA
Te especifica el sink de cuando está configurado como salida y a cero, absorbe corriente, y el source, cuando está como salida y a uno proporcionando corriente, es un poco más claro, 25 mA para ambos.
La diferencia es que con el transistor, el número de leds depende de la corriente que pueda aguantar el transistor, puedes controlar si quieres un motor de varios amperios. El transistor cogerá su corriente de base en el caso de ser bipolar del pin del micro (que será muy pequeña), o no cogerá corriente si es un mosfet. Yo suelo poner mosfets, en el robot de iniciación puse un par de mosfets para encender leds en paralelo y funcionan bien. Usando el pin sin transistor externo pues sólo tienes un máximo de 40 mA, por lo que no puedes poner los n leds de ninguna manera directamente.
La única forma de resolver este tipo de dudas es irte al datasheet y mirar los esquemas del micro, para ver los bloques de componentes que hay y como está implementado por dentro, para hacerte una idea de como funciona y de lo que tienes ahí.
Por ejemplo:
http://www.t4f.org/projects/open-rfid-tag/57 un pic12f funcionando con los pines de masa y vcc sin conectar, aprovechando los diodos de protección. Esta página está interesante.
Saludos.