You have an indentation error on "SET @pos1 = 0" - may seem trivial, but indentation is there, for me at least!, to indicate the logic flow, and thus I am questioning it:
BEGIN
If @extendedDescValue like '%Customer Bin:%'
BEGIN
SET ...
...
END
SET @pos1 = 0
FETCH ...
...
END
so when I see that I immediately think "Is that 'SET @pos1 = 0' indented correctly, in which case it should be inside the BEGIN / END or, perhaps, inside and ELSE??, or should it be at the same indentation as the rest of the code outside the END??
Perhaps made slightly more unsure by the style of indentation as the BEGIN / END themselves are indented. For me this would be a more conventional style
BEGIN
If @extendedDescValue like '%Customer Bin:%'
BEGIN
SET ...
...
END
SET @pos1 = 0
FETCH ...
...
END
either way, whatever coding style you decide is fine. Just make sure you are very consistent in applying it.
As a separate point there is no need to "reset" SET @pos1 = 0 - it is not used after that point, so that is redundant, as is the declaration of @OrderNoValue which is not used (in Peer Review that would cause me to ask "Was this MEANT to be used? or is it redundant?")
But that coding-style issue is incidental to "Why are you using a CURSOR"? Loops are usually the work of the devil in relational databases and I can't see what purpose a LOOP serves here.
You are stepping through all the rows (in INSERTED) that are available to the Trigger and for each one that has
extendedDescValue like '%Customer Bin:%'
you are then updating ALL the rows that match '%Customer Bin:%' BUT you are using the CharIndex of the specific row that that the cursor found.
This may well be working BECAUSE the trigger is ONLY being called / tested with single-row-updates
Scrap the cursor
Change the UPDATE to use the CharIndex in-line
Process all the rows using JOIN INSERTED as s single set - with SQL that is highly likely to be 100x faster than looping round then (whether Cursor or some other Loop method)
Test the Trigger with both one-row and multiple-rows [that match the LIKE '%Customer Bin:%' criteria]
I'm not convinced that your "+12" is correct. That will INCLUDE the ":" in the subsequent SUBSTRING ... which you then LTrim() - clearly the LTrim() is not going to remove anything, and given that you included that function I presume you intention was to remove the whole of 'Customer Bin:' AND any spaces after that?
Here's a test frame work:
DECLARE @extendedDescValue as NVARCHAR(255)
DECLARE @pos1 as int
SELECT @extendedDescValue = 'xxx Customer Bin: yyy '
SELECT @pos1 = CharIndex('Customer Bin:',@extendedDescValue)+12
SELECT [@pos1]=@pos1,
[Substring] = ']' + SUBSTRING(@extendedDescValue,@pos1,99) + '[',
[generic_custom_description] = ']' + ( RTrim(LTrim(SUBSTRING(@extendedDescValue,@pos1,99)))) + '['
try changign "+12" to "+13" and seeing if THAT is what you intended.
Why are you limiting SUBSTRING() to 99 characters? The definition of @extendedDescValue is 255 characters (and it is important that that is at least as big as the Column [extended_desc] INCLUDING remembering to change that @extendedDescValue definition then [extended_desc] changes in future ... that is a significant potential future maintenance bug
Personally I would use STUFF instead of SUBSTRING, because it avoids the issue with SUBSTRING() having to figure out what the final "99" parameter should be, although STUFF() is not well know so you may well never of heard of it ...
Add this to the test framework above:
SELECT [STUFF()] = ']' + RTrim(STUFF(@extendedDescValue,1, @pos1,'')) + '['
and experiment with leading / trailing spaces and any other "test data" that you need to.
What about if the test data was this? What would be the expected outcome?
SELECT @extendedDescValue = 'xxx Customer Bin: yyy Customer Bin: zzz '
? Maybe that is "ridiculous" in the context of your APP though 
Once you have the 12 / 13 offset finalised, and any decisions about TRIMming and so on, then I would suggest that the [whole trigger] code should be something like this:
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- UPDATE oe_line
UPDATE o
SET generic_custom_description
= RTrim(STUFF(extended_desc, 1,
CharIndex('Customer Bin:', extended_desc)+12,
''))
FROM oe_line AS o
INNER JOIN INSERTED i
ON o.line_no = i.line_no
WHERE o.extended_desc like '%Customer Bin:%'
END
Does [generic_custom_description] ever get updated by any other means? What if this row was updated (e.g. by a User) again and the "Customer Bin" stuff was removed, and the whole thing replaced with "1234" - would it matter than the [Customer Bin] still contained the parsed data from the "Customer Bin" at the previous update? (or maybe the user is able to, also, change the [generic_custom_description] value)