This is actually by design. Within the scope of a local variable, triggers act like function calls; for each depth of the function call, local variables hold unique state (like with recursive functions in traditional programming languages).
So when 'On start of layout' fires, 'Health' has the value 0. Then you call the "SetHealth" function. Because a new trigger is firing within another trigger, it actually becomes a new unique value. Think of it as 'Health2' at this point. You set 'Health2' to 100, then the function returns. 'Health2' scopes out since the function call has ended, then it returns to continue execution in 'Start of layout'. This returns to using 'Health', which was not actually modified, so is still 0.
Workaround: make it a static variable.