The error message attempts to explain the issue. If the OPC server indeed does not support OPC-DA 2.0 browsing, AND you are calling a BrowseXXXX method on one of the sub-folders without browsing their parents first, then the behavior is by design.
Explanation: In OPC-DA 1.0, there is no general way to start the browsing from the point given by an Item ID. One always has to go from the root. And, the OPC does not have a general syntax for OPC item IDs, so if the client is provide just with the "SimDevice.Filter1.FlowRate" Item ID string, it cannot parse it using the dots as delimiters, because there is no such thing in the OPC specs, and other servers may do it differently. Only OPC 2.0 and later allows to pass in an Item ID and browse from there.
So, if the server only has OPC-DA 1.0 or if it has OPC-DA 2.0 but does not support the OPC_BROWSE_TO sub-functionality, the only way to browse to sub-nodes is to always start from the root. Call BrowseBranches on the root. Then, call it on "SimDevice". Then, call it on "SimDevice.Filter1", etc. This should work.
The other way to do it would be to use "browse path" instead of the Item ID. As opposed to an Item ID, there is a well-known syntax for the browse path, - because we have defined it, on the client side. The browse path has to start with "/", and then each element is separated by "/" as well. In your case, the browse path will probably be e.g. "/SimDevice/Filter1/FlowRate". The browse path cannot, however, be simply used in place of an item ID. Instead, you need to construct a DANodeDescriptor, set its BrowsePath property, and then pass the DANodeDescriptor to one of the BrowseBranches/BrowseLeaves/BrowseNodes methods.
If you believe that the server actually *does* support OPC-DA 2.0 with OPC_BROWSE_TO, or OPC-DA 3.0, then the error you are getting would not be the expected behavior, and we will have to look deeper.