I don't think you can.
The thing is that the object is still a dog. the behavior you're describing (getting "ruff" from the casted object rather than "hello") is standard because you want to be able to use the animal class to let a bunch of different type of animals speak.
For example, if you had a third class as thus:
Public Class Cat
Inherits Animal
Public Overrides Function Speak() As String
Return "Meow"
End Function
End Class
Then you'd be able to access them like thus:
protected sub Something
Dim oCat as New Cat
Dim oDog as New Dog
MakeSpeak(oCat)
MakeSpeak(oDog)
End sub
protected sub MakeSpeak(ani as animal)
Console.WriteLine(ani.Speak())
end sub
What you're talking about doing basically breaks the inheritance chain. Now, this can be done, by setting up the Speak function to accept a parameter which tells it to return it's base value or not or a separate SPEAK function for the base value, but out of the box, you're not going to get things that behave this way.