Na POO os objetos criados guardam somente endereços para o destino da memória que o realmente contém
Em C também dá pra fazer isso com ponteiros, e sem nada de POO. Isso não é exclusividade da orientação a objeto.
Sem contar que em C# os structs podem ficar no stack ou no heap depedendo do caso, e são tipos por valor. E ter "eventos" não é obrigatório. E mesmo os 4 pilares não são consenso, há muita discussão sobre o que realmente é POO: http://wiki.c2.com/?NobodyAgreesOnWhatOoIs
Enfim, hoje em dia as definições e limites são bem mais difíceis de determinar - o buraco é bem mais embaixo do que o texto dá a entender...