Mike above is right that you need Stash 2.2.0 or later to use process="end"
.
However, your code has another problem. You are looping over channel entries, then looping over the parents of each entry, then finally looping over the categories assigned to each parent. Let me show you how that would be parsed:
{!-- Start --}
{exp:channel:entries channel="campus" category="not 156" orderby="title" sort="asc"}
{exp:playa:parents channel="classes" category="304" disable=""}
{categories}
{exp:stash:set name="wufoo_id"}
{classes_wufoo_id}
{/exp:stash:set}
{/categories}
{/exp:playa:parents}
{/exp:channel:entries}
{!-- After first pass, if 2 entries --}
{exp:playa:parents entry_id="1" channel="classes" category="304" disable=""}
{categories}
{exp:stash:set name="wufoo_id"}
{classes_wufoo_id}
{/exp:stash:set}
{/categories}
{/exp:playa:parents}
{exp:playa:parents entry_id="1" channel="classes" category="304" disable=""}
{categories}
{exp:stash:set name="wufoo_id"}
{classes_wufoo_id}
{/exp:stash:set}
{/categories}
{/exp:playa:parents}
{!-- During second pass, if 2 parents for each entry --}
{categories}
{exp:stash:set name="wufoo_id"}
{classes_wufoo_id}
{/exp:stash:set}
{/categories}
{categories}
{exp:stash:set name="wufoo_id"}
{classes_wufoo_id}
{/exp:stash:set}
{/categories}
{categories}
{exp:stash:set name="wufoo_id"}
{classes_wufoo_id}
{/exp:stash:set}
{/categories}
{categories}
{exp:stash:set name="wufoo_id"}
{classes_wufoo_id}
{/exp:stash:set}
{/categories}
{!-- During second pass, if 2 categories for each parent --}
{exp:stash:set name="wufoo_id"}
1
{/exp:stash:set}
{exp:stash:set name="wufoo_id"}
5
{/exp:stash:set}
{exp:stash:set name="wufoo_id"}
2
{/exp:stash:set}
{exp:stash:set name="wufoo_id"}
7
{/exp:stash:set}
{exp:stash:set name="wufoo_id"}
9
{/exp:stash:set}
{exp:stash:set name="wufoo_id"}
2
{/exp:stash:set}
{exp:stash:set name="wufoo_id"}
1
{/exp:stash:set}
{exp:stash:set name="wufoo_id"}
9
{/exp:stash:set}
However, you appear to be trying to capture only a single variable. Did you instead want a list?