Seems like the easiest solution would be to enable populate on demand for the tree, and keep the procs pulling one at a time.
However, you can easily get all levels of the tree with a single sql call. A proc something like
DECLARE @ret TABLE
(
ID int,
CategoryName varchar(50),
ParentID int,
HierarchyLevel int
)
SELECT @lvl = 0
INSERT INTO @ret
SELECT
ID,
CategoryName,
ParentID,
@lvl as HierarchyLevel
FROM
MyTable
WHERE
ParentID = -1
SET @rowCount = @@rowcount
WHILE @rowCount > 0
BEGIN
SELECT @lvl = @lvl + 1
INSERT INTO @ret
SELECT
m.ID,
m.CategoryName,
m.ParentID,
@lvl as HierarchyLevel
FROM
MyTable m
INNER JOIN @ret r ON m.ParentID = r.ParentID AND r.HierarchyLevel = @lvl-1
WHERE
m.ID not IN (SELECT r2.ID FROM @ret r2) --prevent infinite loops (not necessary for most scenerios)
SET @rowcount = @@rowcount
END
SELECT * FROM @ret
NOTE: I Have not tried this query out, from top of my head, but it should get you started.