jezrael's answer was close to my need, but didn't accommodate non-unique combinations of columns 'Chain', 'Food', and 'Healthy'.
So thanks to piRSquared's answer, I was able to create the following solution (which answers @MikeLee's question from the comments of jezrael's answer):
df = pd.DataFrame({
'Name': ['George', 'George', 'John', 'John', 'John'],
'Chain': ['McDonalds', 'KFC', 'Wendys', 'McDonalds', 'McDonalds'],
'Food': ['burger', 'chicken', 'burger', 'salad', 'Frenchies'],
'Healthy': [False, False, False, True, False],
})

First, jezrael's answer for comparison with the same input from the OP (notice that I slice off the last row):
df.iloc[0:3].groupby('Name')[['Chain','Food','Healthy']].apply(lambda x: x.set_index('Chain').to_dict(orient='index')).to_dict()
{'George': {'McDonalds': {'Food': 'burger', 'Healthy': False},
'KFC': {'Food': 'chicken', 'Healthy': False}},
'John': {'Wendys': {'Food': 'burger', 'Healthy': False}}}
Now, the problem if we add the additional row for McDonalds:
df.groupby('Name')[['Chain','Food','Healthy']].apply(lambda x: x.set_index('Chain').to_dict(orient='index')).to_dict()
ValueError: DataFrame index must be unique for orient='index'.
And finally my answer inspired by piRSquared:
from collections import defaultdict
def recursive_defaultdict():
return defaultdict(recursive_defaultdict)
d = recursive_defaultdict()
for _, row in df.iterrows():
d[row['Name']][row['Chain']][row['Food']] = row.drop(['Name', 'Chain', 'Food']).to_dict()
dict(d) # which may be undesireable if you wanted both "Food" _and_ "Healthy" as keys under the "Chain" key
{'George': defaultdict(<function __main__._recursive_defaultdict()>,
{'McDonalds': defaultdict(<function __main__._recursive_defaultdict()>,
{'burger': {'Healthy': False}}),
'KFC': defaultdict(<function __main__._recursive_defaultdict()>,
{'chicken': {'Healthy': False}})}),
'John': defaultdict(<function __main__._recursive_defaultdict()>,
{'Wendys': defaultdict(<function __main__._recursive_defaultdict()>,
{'burger': {'Healthy': False}}),
'McDonalds': defaultdict(<function __main__._recursive_defaultdict()>,
{'salad': {'Healthy': True},
'Frenchies': {'Healthy': False}})})}