I can see why you're doing what you're doing, although trying to read your code (and destruk's) makes my head hurt.
So I'd have to agree with the others that a flag might make for cleaner, easier-to-debug, easier-to-maintain code:
found = false
for each item in stack
if item = myval
found = true
exit for
endif
end for
if not found
' Not found ...
endif
No loop counters (and therefore no scope worries if that's something that concerns you), no start/end condition errors, no worrying about whether your loops should be starting/ending/incrementing/decrementing by 1 or zero or -1, or if your test condition should be "< 0", "= 0", "<= 0", " < 1" etc. I suppose it would still be possible to make mistakes (like get the trues and falses) mixed up, but I think that kind of error would be easier to spot.
Although if you have to search the stack backwards, like in your example, then you'll probably have to end up using a loop counter anyway, although I'd do something like:
found = false
i = stack.Count () - 1 ' Last item
while not found and i >= 0 ' Be sure to examine first item (0)
if stack [i] = myval
found = true
else
i = i - 1
endif
end while