All of your problems are caused by obfuscation - trying to write a simple algorithm as complicated as possible (bad programming). This does not only cause the mentioned bug(s) but also reduces readability and performance.
Had you tried to write the simple algorithm as simple as possible (good programming), there would have been no problems and the code would also execute faster:
#include <stdio.h>
#include <limits.h>
int main (void)
{
const char* str="Hello";
char least = CHAR_MAX;
for(size_t i=0; str[i] != '\0'; i++)
{
if(str[i] < least)
{
least = str[i];
}
}
printf("%c = %d", least, least);
}